2009-11-27 4 views
0

모델 바인딩을 양식의 하위 클래스에 가져 오려고합니다.asp.net mvc 및 하위 개체가있는 모델 바인딩 개체

관련된 PageContent 클래스가있는 Page 클래스가 있습니다. Page 오브젝트에는 많은 PageContent 오브젝트가 있습니다. ie Page.PageContents

Page를 모델로 반환하고 모든 PageContent 항목을 볼 수 있습니다.

그러나 모델 바인딩을 유지할 수 있도록 양식에 PageContent 항목을 할당하는 방법에 대해 약간 모호합니다.

페이지 모델을 다시 컨트롤러에 게시 할 때 PageContent 목록이 비어 있습니다. 내가 제대로 형태의 PageContents 측면을하지 않은 생각하고

<% using (Html.BeginForm("SavePage", "Admin")) {%> 

    <fieldset> 
     <legend>Fields</legend> 
     <%=Html.Hidden("PageId", Model.PageId) %> 
     <p> 
      <label for="Title">Title:</label> 
      <%= Html.TextBox("Title", Model.Title) %> 
      <%= Html.ValidationMessage("Title", "*") %> 
     </p> 
     <p> 
      <label for="SysName">SysName:</label> 
      <%= Html.TextBox("SysName", Model.SysName) %> 
      <%= Html.ValidationMessage("SysName", "*") %> 
     </p> 

     <% 
      int i = 0; 
     foreach (var pageContent in Model.PageContents) 

      { %> 
      <div> 
       <%=Html.Hidden("PageContents[" + i + "].PageContentId", pageContent.PageContentId) %> 
       <%=Html.TextArea("PageContents[" + i + "].Content", pageContent.Content)%>     
      </div> 
     <% 
      i++; 
     } %> 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 
    </fieldset> 

<% } %> 

: 여기

양식의 조각입니다. 편집

: 나는

도와주십시오으로 Request.Form 스타일을 사용하지 않는

public ActionResult SavePage(Page page) 
    { 
     // do stuff with page.PageContents 
     return View("PageEdit", page); 
    } 

: 여기 내가가 POST 기본 컨트롤러 방법 D

+0

컨트롤러에서 게시 방법은 어떻게 보이나요? –

+0

Page.PageContents의 유형은 무엇입니까? 그것은 IList 또는 PageContent []입니까? 배열에 바인딩 할 수 없었습니다. – Max

+0

나는 직접 DBML 자동 어구를 사용하고있다. 그래서 그것의 EntitySet <> : 엔티티 세트 Page.PageContents –

답변

1

당신은 Page.PageContents는 말했다 EntitySet<PageContent>이며 자동 생성 클래스를 사용하고 있습니다. 그래서, LINQ to SQL을 사용하고 있습니까? 그렇다면 클래스를 사용하여 생성 된 클래스에 속성을 추가 할 수 있습니다.

나는 유사한 문제가 있음을 기억하며 EntitySet<T> 속성에 바인딩 할 수 없었습니다. 나는 실제 속성을 효과적으로 설정하는 IList<T> 인 프록시/자리 표시 자 속성을 사용하여 문제를 해결했다고 생각합니다. 따라서, 귀하의 경우, 그것은 다음과 같이 보일 것입니다 :

// Your partial class, adding a property to the generated class 
public partial class Page 
{ 
    // Bind to this property 
    public IList<PageContent> MyPageContents 
    { 
     set 
     { 
      var set = new EntitySet<PageContent>(); 
      set.AddRange(value); 
      PageContents = set; 
     } 
     get { return PageContents; } 
    } 
} 

// This and probably a lot more is created by LINQ to SQL 
public partial class Page { 
    // ... 

    public EntitySet<PageContent> PageContents 
    { 
     get; 
     set; 
    } 

    // ... 
} 

나는 자동차 클래스를 생성 된 partial 클래스가 같은 공간에 있어야 생각합니다. 여기에 대한 자세한 정보 : Adding new methods to LINQ to SQL generated classes

그리고 양식에서 PageContents 대신 MyPageContents (물론 더 나은 이름을 사용할 수 있음)를 바인딩합니다.

LINQ to SQL을 마지막으로 사용한 이후로 꽤 오래 전부터 사용하길 바랍니다.

+0

밤, 작동합니다 : D 당신은 스타입니다. 바라기를이 작은 속임수는 mvc 2.0에서 수정되었습니다. –

관련 문제