컬렉션 속성, 특히 목록이있는 모델에 바인딩하려고합니다.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
) 내부 : 여기
등 청소를 - 그것은 즉, 필요한 모든 코드 믿기 어렵다! 도와 주셔서 대단히 감사합니다. – Neilski