MVC 4 Forms를 사용하여 List<T>
속성 에 항상 4 개의 자식을 포함하는 모델이 있습니다. 이보기는 Razor 부분보기로 렌더링 된 4 개의 자식 모델 각각을 사용하여 모델을 올바르게 표시합니다. 문제는 제출 / 게시 할 때 모델이 자식 목록에 대해 null 값으로 역 직렬화된다는 것입니다.
모델:
public class MyModel
{
public int SomeValue { get; set; }
public List<ChildModel> Children { get; set; }
...
}
전망:
@model MyProject.Models.MyModel
@using (Html.BeginForm())
{
@Html.LabelFor(model => model.SomeValue)
@Html.Partial("ChildPartial", Model.Children[0])
@Html.Partial("ChildPartial", Model.Children[1])
@Html.Partial("ChildPartial", Model.Children[2])
@Html.Partial("ChildPartial", Model.Children[3])
<input type="submit" value="Save" />
}
제어 장치:
public class MyController : Controller
{
public ActionResult Index()
{
MyModel model = new MyModel();
model.Children = new List<ChildModel>();
model.Children.Add(new ChildModel());
model.Children.Add(new ChildModel());
model.Children.Add(new ChildModel());
model.Children.Add(new ChildModel());
return View(model);
}
[HttpPost]
public ActionResult Index(MyModel model)
{
//model.Children is null here
//do stuff
...
return RedirectToAction("Index", "SomeOtherController");
}
}
ChildPartial
뷰는 각 제대로 렌더링하고, 나는 컨트롤에 값을 입력하고, 그러나 그들은으로 직렬화되지 않습니다 List<ChildModel>
. MyModel
Post 메서드에서 역 직렬화 할 루트 수준 속성 만 가져올 수 있습니다 .
UpdateModel(model);
컨트롤러 Post 메서드의 시작 부분에 추가하려고 시도 했지만 운이 없습니다. 어떤 아이디어?
편집하다
ChildModel.cs :
public class ChildModel
{
public String Name { get; set; }
public double Ratio { get; set; }
...
}
ChildPartial.cshtml :
@model MyProject.Models.ChildModel
<div>
<div>
<div>
<span>@Model.Name</span>
</div>
<div>
@Html.LabelFor(m => m.Ratio)
@Html.TextBoxFor(m => m.Ratio, new { autocomplete = "off" })
@Html.ValidationMessageFor(m => m.Ratio)
</div>
</div>
...
</div>
먼저 기본 모델 바인더가 기대하는 특정 구문과 컬렉션에 바인딩 할 때 명명 규칙에 대해 읽어 볼 것을 권장합니다. http://haacked.com/archive/2008/10/23/model-binding-to-a-list .aspx
입력 필드의 이름을이 블로그 게시물에 설명 된 이름과 비교하면 코드가 작동하지 않는 이유를 매우 빠르게 이해할 수 있습니다. 표준 명명 규칙을 따르지 않습니다.
이 문제를 해결하려면 편집기 템플릿을 사용하는 것이 좋습니다. 따라서 기본보기에 다음을 입력하십시오.
@model MyProject.Models.MyModel
@using (Html.BeginForm())
{
@Html.LabelFor(model => model.SomeValue)
@Html.EditorFor(model => model.Children)
<input type="submit" value="Save" />
}
그런 다음 이동 ChildPartial.cshtml
에를 ~/Views/Shared/EditorTemplates/ChildModel.cshtml
. 템플릿의 이름과 위치는 매우 중요합니다. 당신이 그것을 따랐는지 확인하십시오. 그리고 이것을 안에 넣으십시오.
@model MyProject.Models.ChildModel
<div>
<div>
<div>
<span>@Model.Name</span>
</div>
<div>
@Html.LabelFor(m => m.Ratio)
@Html.TextBoxFor(m => m.Ratio, new { autocomplete = "off" })
@Html.ValidationMessageFor(m => m.Ratio)
</div>
</div>
...
</div>
좋아, 이제 프로젝트를 실행하고 생성 된 HTML을 검사하고 더 구체적으로 입력 필드의 이름을 초기 버전과 비교하고 내 대답에서 처음에 링크 한 블로그 게시물과 비교하면 모델 바인딩 방법에 대한 모든 것을 이해할 수 있습니다 컬렉션은 ASP.NET MVC에서 작동합니다.
참고 : 자식 템플릿에는 Name
ChildModel 속성에 해당하는 입력 필드가 없습니다 . 따라서 컨트롤러에서 null 인 경우 놀라지 마십시오. 양식이 제출 될 때 단순히 값을 보내지 않습니다. 이 작업을 수행하려면 편집기 템플릿에 숨겨진 필드로 포함 할 수 있습니다.
@Html.HiddenFor(m => m.Name)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다