POST上

时间:2015-10-23 13:06:20

标签: c# asp.net-mvc

我有一个复杂的模型类,如:

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 中的完整类结构?

1 个答案:

答案 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

将正确命名表单控件。