2013-05-10 3 views
0

팀이 여러 기관에 소속 될 수 있고 기관이 여러 팀을 보유 할 수있는 다 대다 관계에 대한 양식을 작성하려고합니다.GET 및 POST 값이 메서드 서명에 올바르게 매핑되지 않았습니다.

현재의 문제는 팀을 팀에 할당하는 것과 관련이 있습니다. 팀에서 "이 기관 추가"버튼을 사용하여 컨트롤러에서 "addInstitution"액션을 트리거하는 선택 상자를 만드는 것이 아이디어입니다. 모든 현재 할당 된 기관과 함께 팀/편집 행동에 나는 ViewBag selectList의 객체로 모든 기관을 넣어 가지고,이 올바르게 표시됩니다

@using (Html.BeginForm("AddInstitution", "Team", new { team = Model.ID }, FormMethod.Post)) 
{ 
    @Html.AntiForgeryToken() 

    <div> 
     Add to institution: 
    </div> 

    <div> 
     @Html.DropDownList("institution", (SelectList)ViewBag.Institutions) 
    </div>  

    <div> 
     <ul> 
      @foreach (var item in Model.Institutions) 
      { 
       <li>@item.InstitutionName</li> 
      } 
     </ul> 
    </div> 

    <div> 
     <input type="submit" value="Add" /> 
    </div> 

} 

이 정보를 표시하면 잘 작동합니다. 그러나 GET 또는 POST 매개 변수 (팀 및 기관)가받는 메소드의 매개 변수에 매핑된다는 인상하에 있었기 때문에 팀이 objectRouteValues ​​양식을 사용하는 이유는 무엇입니까? 선택 상자 값 :

[HttpPost] 
[ValidateAntiForgeryToken] 
public string AddInstitution(Team team, Institution institution) 
{ 
    return "team: " + team.ID + ", institution: " + institution.ID; 
} 

이 메서드의 매개 변수는 모두 null입니다. 왜 메소드 시그니처에 올바르게 매핑되지 않았는지 알고있는 사람은 누구입니까?

보너스 질문 : 다 대 다 관계에 대한 양식을 작성하기위한 기본 전략입니까, 아니면 더 좋은 방법입니까?

+0

메소드 서명에서 객체 식별자를 "int"로 대체하면 실제로 작동한다는 것을 발견했습니다. 즉, dbcontext에서 객체를 찾아서 업데이트 할 수 있습니다. 그렇지만 서명이있는 ID에서 객체를 인스턴스화 할 수 없습니까? –

+0

두 모델을 같은 방식으로 사용할 수 없다고 생각합니다. –

+0

하나의 모델 만 View에 할당하고 SelectList를 ViewBag에 할당합니다. –

답변

0

좋아요. 그래서 모든 것에 대해 완전히 명확하지 않습니다. 페이지의 모델이 어떻게 정의되는지보고 싶습니다.

FormCollection을 사용하여 양식에 있던 모든 것을 가져올 수 있습니다.

public string AddInstitution(Team team, FormCollection frm) 
{ 
//you should just get frm["institution"] but I'm not super sure, 
//put a breakpoint and use the immediate window and inspect frm. 
} 

이 작업을 수행하는 올바른 방법은 이보기는 뷰 모델 내부의 모든 것을 표현이다. 페이지 당 하나의 ViewModel 만 있어야합니다.

+0

보기가 강하게 입력 모델을 경우에도? –

+0

@ewvfwrwwvw 무슨 뜻인가요? ViewModel은 뷰를 나타내는 모델 또는 일반 클래스 (일반적으로 비헤이비어)입니다. 그래서 그것은 그 견해가 가지는 모든 것을 포괄해야합니다. 데이터베이스 스키마를 나타내는 별도의 ** 데이터 모델 **과이 둘 사이의 변환을 가질 수 있습니다. – gideon

+0

나는 그것이 대안이라는 것을 의미했다. 근본 원인은 무엇입니까? –

0

작업의 팀 및 기관 매개 변수는 클래스입니다. 클래스/매개 변수 이름 자체가 아닌 해당 클래스의 적어도 하나의 속성에 대한 입력 필드를 제공해야합니다. 같은 규칙이 적용되는 기관 매개 변수의

@using (Html.BeginForm("AddInstitution", "Team", FormMethod.Post)) 
{ 
    @Html.Hidden("team.Id", Model.ID) 
} 

: 팀 매개 변수의 Id 속성에 바인딩 예를 들어

는, 당신은 team.Id라는 이름의 숨겨진 필드를 사용할 수 있습니다.

@Html.DropDownList("institution.Id", (SelectList)ViewBag.Institutions) 

그 방법은 ModelBinder를이 클래스의 인스턴스를 생성하고 Id 속성에 양식 값을 할당합니다 : 당신은 필드 institution.Id를 호출해야합니다.

관련 문제