2011-03-01 3 views
1

컬렉션 속성, 특히 목록이있는 모델에 바인딩하려고합니다.MVC - 사용자 지정 템플릿을 사용하여 컬렉션에 대한 데이터 바인딩 문제

public class RolesModel 
{ 
    private List<SelectListItem> _Roles = null; 
    public string Name { get; set; } 
    public List<SelectListItem> Roles 
    { 
     get { 
     if (_Roles == null) { _Roles = new List<SelectListItem>(); } 
     return _Roles; 
     } 
     set { _Roles = value; } 
    } 
} 

나는 다음과 같은 컨트롤러를 통해 강력한 형식의보기로이 바인딩입니다 :

public class TestController : Controller 
{ 
    RolesModel myModel = new RolesModel(); 

    [HttpGet] 
    public ActionResult Edit() 
    { 
     myModel.Name = "Joe Bloggs"; 
     myModel.Roles = new List<SelectListItem> 
     { 
     new SelectListItem { Value = "1", Text = "Member", Selected = true }, 
     new SelectListItem { Value = "2", Text = "Manager", Selected = true }, 
     new SelectListItem { Value = "3", Text = "Administrator", Selected = false } 
     }; 

     return View(myModel); 
    } 


    [HttpPost] 
    public ActionResult Edit(RolesModel m) 
    { 
     // !!! m.Roles is always empty !!! 
     return View("Results", m); 
    } 
} 

이 다음 뷰를 호출이 예제의 목적을 위해,이 사용자 역할의 목록을 나타냅니다 :

@model MyProject.WebUI.Models.RolesModel 
@using (Html.BeginForm()) 
{ 
    <p> 
     @Html.LabelFor(m => m.Name) 
     @Html.EditorFor(m => m.Name) 
    </p>        
    <div> 
     @Html.EditorFor(m => m.Roles, "CheckBoxList") 
    </div>        
    <p> 
     <input type="submit" value="Save" /> 
    </p> 
} 

주 '/Views/Shared/EditorTemplates/CheckBoxList.cshtml'에서 내 사용자 정의 편집기 템플릿에 템플릿 특정 호출이는 다음과 같습니다

@model List<System.Web.Mvc.SelectListItem> 

<h3>Type: @Html.LabelFor(m => m)</h3> 
<ul> 
    @for (int i = 0; i < Model.Count; i++) 
    { 
     <li> 
     @Html.CheckBoxFor(m => m[i].Selected) 
     @Html.LabelFor(m => m[i].Selected, Model[i].Text) 
     @Html.HiddenFor(m => m[i].Value) 
     </li> 
    } 
</ul> 

각 SelectListItem은 루프에 의해 렌더링 된 Html로 표현됩니다.

프로세스의 첫 번째 부분이 올바르게 작동합니다. 양식이 예상대로 표시되고 '이름'텍스트 상자를 업데이트하고 확인란의 선택/선택을 취소 할 수 있습니다.

양식을 컨트롤러에 다시 게시하면 Roles 컬렉션이 채워지지 않습니다.

MVC를 처음 접했고 실제로 프레임 워크가 강제적 인 양식 요소 명명 규칙을 통해 게시물에서 모델 데이터를 재구성했다고 생각했습니다. 나는 분명히 중요한 요점을 놓치고 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바라고 있습니다.

감사합니다. 긴 게시물에 사과드립니다.

@model MyProject.WebUI.Models.RolesModel 
@using (Html.BeginForm()) 
{ 
    <p> 
     @Html.LabelFor(m => m.Name) 
     @Html.EditorFor(m => m.Name) 
    </p>        
    <div> 
     <ul> 
      @Html.EditorFor(m => m.Roles) 
     </ul> 
    </div>        
    <p> 
     <input type="submit" value="Save" /> 
    </p> 
} 

을하고 EditorTemplate (/Views/Shared/EditorTemplates/SelectListItem.cshtml) 내부 : 여기

답변

5

계속 진행 수있는 방법

@model System.Web.Mvc.SelectListItem 
<h3>Type: @Html.LabelFor(m => m)</h3> 
<li> 
    @Html.CheckBoxFor(m => m.Selected) 
    @Html.LabelFor(m => m.Selected, Model.Text) 
    @Html.HiddenFor(m => m.Value) 
</li> 

공지 사항 편집기 템플릿의 단순화. 더 이상 List<SelectListItem>은 모델이 아니며 단순히 SelectListItem입니다. Roles 컬렉션의 각 요소에 대해 자동으로 호출되므로 루프를 작성할 필요가 없습니다. 그냥 규칙을 따르십시오.

나는 또한이 같은 뷰 모델을 단순화하는 것 :

public class RolesModel 
{ 
    public string Name { get; set; } 
    public IEnumerable<SelectListItem> Roles { get; set; } 
} 

및 컨트롤러를 :

public class TestController : Controller 
{ 
    public ActionResult Edit() 
    { 
     var myModel = new RolesModel 
     { 
      Name = "Joe Bloggs", 
      Roles = new[] 
      { 
       new SelectListItem { Value = "1", Text = "Member", Selected = true }, 
       new SelectListItem { Value = "2", Text = "Manager", Selected = true }, 
       new SelectListItem { Value = "3", Text = "Administrator", Selected = false } 
      } 
     }; 
     return View(myModel); 
    } 

    [HttpPost] 
    public ActionResult Edit(RolesModel m) 
    { 
     // m.Roles should be correctly bound 
     return View("Results", m); 
    } 
} 
아름답게 작동
+0

등 청소를 - 그것은 즉, 필요한 모든 코드 믿기 어렵다! 도와 주셔서 대단히 감사합니다. – Neilski

관련 문제