2013-06-13 4 views
1

아래에 나열된 뷰가 있습니다.면도기 뷰에서 매개 변수 생성자 호출

양식을 게시하면 Organization의 기본 생성자가 호출됩니다. 그러나 Party 객체를 사용하는 다른 생성자를 호출해야합니다.

면도기 또는 다른 방법으로 mvc, pls를 사용하는 방법.

내 코드 :

public O(Pobj) 
     : this() 
    { 
     P= obj; 
    } 

보기 :

@using P.M.O 


@model IEnumerable<O> 
@{ 
ViewBag.Title = "Details"; 
} 

<table> 
    <tr> 
    <th> 
     @Html.Raw("Caption") 
    </th> 
    <th></th> 
</tr> 
<tr> 
<td colspan="4"> 
    @using (Html.BeginForm("Edit", "O", FormMethod.Post)) 
    { 
     <table> 
      <tr> 
      @foreach (var item in Model) 
      { 

       <td class="txt"> 
        @Html.TextBox("C", item.GetValForProp<string>("C"), new { @class = "txt" }) 
       </td> 
       <td class="txt"> 
        @Html.TextBox("N", item.GetValForProp<string>("N"), new { @class = "txt" }) 
       </td> 
       <td class="txt"> 
        @Html.TextBox("D", item.GetValForProp<string>("D"), new { @class = "txt" }) 
       </td> 
       <td> 
        <button type="submit">Edit</button> 
       </td> 
      } 
      </tr> 
     </table> 
    } 
</td> 
가 여전히 해결되지 않은 위의 질문에 대한 추가, 나는 또 다른 질문을 가지고있다.

내 조직은 다른 개체 파티의 하위 항목입니다. 조직에 해당하는 파티 테이블 세부 정보가있는 속성 파티가 있습니다 (orgobj.Party에는 파티 객체가 있음).

편집을 클릭하면 내 컨트롤러에서 orgobj.Party가 null이고 편집이 작동하지 않습니다. 예외 : 참조 무결성 제약 조건 위반이 발생했습니다. 참조 제약 조건을 정의하는 속성 값이 관계의 주체 및 종속 개체간에 일치하지 않습니다.

편집 컨트롤러에서 사용할 수있는 oganization의 바인드 파티를 모델링 할 수 있습니까?

+0

흥미로운 질문이지만 나는 그렇게 할 수 없다고 확신합니다. 공사가 끝난 후 파티 속성을 설정 하는게 어때? – Serge

+0

이렇게하려면'Organization'에 대한 커스텀'ModelBinder'를 등록해야합니다. 아직'파티 '를 기대하는 생성자에게 무엇이 전달 될지 궁금하다. – haim770

+0

Organization 객체 (orgObj.Party) 내에있는 생성자에 Party 객체를 전달할 수 있습니다. ModelBinder를 사용하는 방법에 대해 조언 할 수 있습니까? – mmssaann

답변

1

다소 까다 롭지만 경우에 따라 수행 할 수 있습니다. 귀하의 코드를 기반으로 조직 개체를 시작할 때 사용할 수있는 Party 개체가 있다고 가정합니다.

이 문제를 해결할 수있는 유일한 방법은 맞춤형 ModelBinder를 이용하는 것입니다. 아래의 예제에서는 Party 객체를로드하고 Organization 객체를 시작하는 데 사용할 수있는 들어오는 PartyId 매개 변수가 있다고 가정합니다. Party 객체를 다른 방법으로 검색 할 수는 있지만 중요하지는 않습니다. ModelBinder를 사용하여 한 가지 방법 만 보여주고 있습니다.

public class OrganizationModelBinder : DefaultModelBinder 
{ 
    protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 
    { 
     // Try to get incoming PartyId 
     int partyId = 0; 
     ValueProviderResult value = bindingContext.ValueProvider.GetValue("PartyId"); 
     if (value == null) 
     { 
      throw new Exception("Missing party id"); 
     } 
     int.TryParse(value.AttemptedValue, out partyId); 

     // Load Party object from PartyId 
     DbContext db = new DbContext(); 
     Party party = db.Parties.FirstOrDefault(p => p.PartyId == partyId); 

     if (party == null) 
     { 
      throw new Exception("Invalid party"); 
     } 


     return new Organization(party); 

     // If you want to create an instance dynamically based upon the modelType 
     // passed in as an parameter then you'll have to use the following return 
     // line instead. 
     // return Activator.CreateInstance(modelType, party); 
     // 
     // If using this second return line you just have to add one 
     // ModelBinders.Binders.Add(...) line for each and every one of the models 
     // you want to use. 
    } 
} 

은 또한이 당신을 위해 일하게 될 수 Global.asax.cs

ModelBinders.Binders.Add(typeof(Organization), new OrganizationModelBinder()); 

Application_Start()에서 모델 바인더를 등록해야 ...하지만 그것은 모두 당신이 뭘하려는 건지에 따라 달라집니다.

+0

Ohlin 답장을 보내 주셔서 감사합니다. 바인더를 넣을 수있는 가장 좋은 장소는 무엇입니까? 어떤 프로젝트에서 (내 d2admin은 모든 뷰를 가지고 있고, 내 partyweb에는 컨트롤러가 있고 partybiz에는 모델이 있습니다.) – mmssaann

+0

아주 좋은 질문입니다. 모델을 데이터베이스에 바인딩하는 부분과 관련이 있어야하며, 경우에 따라서는 파티가 될 수도 있습니다.나는 틀릴 수도 있지만, 그것이 내가 먼저 시도 할 곳입니다. – Ohlin

+0

흠 감사합니다. 나는 바인더를 시도하고 멋지게! 마지막 질문 하나, 모든 모델에 제네릭 바인더를 사용할 수 있습니까? 나는 20 개 이상의 30 개 모델을 가지고 있으며, 각 모델마다 바인더를 갖는 것이 좋지 않습니까? 아닙니다. – mmssaann