我有一个复杂的模型类,如:
public class Client
{
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string AddressLine { get; set; }
}
我的视图由几个部分组成,我将部分模型传递给它们并处理一些字段用于编辑:
在Index.cshtml中
@using (Html.BeginForm("Index"))
{
@Html.DisplayNameFor(modelItem => model.Name)
@Html.DisplayFor(modelItem => model.Name)
<div id="divAddress">
@Html.Action("_Address", model.Address)
</div>
<div>RESULT MESSAGE GOES HERE!</div>
<input type="submit" value="Submit" />
}
在_Address.cshtml
中@Html.DisplayNameFor(modelItem => model.AdressLine)
@Html.EditorFor(modelItem => model.AdressLine)
在代码隐藏中,我的动作由两个简单的ActionResults方法组成:
[HttpGet]
public ActionResult Index()
{
Client = new Client();
Client.Name = "António Fonseca"
return View(model);
}
[HttpPost]
public ActionResult Index(Client model)
{
return View(model);
}
public ActionResult _Address(Address model)
{
return View(model);
}
当我提交表单时,我需要使用完整的Client
结构调用WebService并显示它的结果消息。
当命中Index(model) -> model.Address
为空时会发生什么。
它只有在遇到_Address(model)
方法时才会被绑定。
有没有办法使用PartialViews绑定主Action 中的完整类结构?
答案 0 :(得分:1)
将_Address.cshtml
中的模型更改为与主视图中的模型相同,并使用@Html.Action("_Address", model)
以便正确命名表单控件 - 即name="Address.AdressLine"
(其当前只是{ {1}}但您的模型不包含名为name="AdressLine"
)的属性。
AdressLine
然而,使用@model Client
@Html.DisplayNameFor(m => m.Address.AdressLine)
@Html.EditorFor( m=> m.Address.AdressLine)
并不是正确的方法。你应该使用@Html.Action()
。将EditorTemplate
重命名为_Address.cshtml
(以匹配您的班级名称)并将其放在Address.cshtml
文件夹中,然后在视图中使用
/Views/Shared/EditorTemplates
将正确命名表单控件。