MVC 4 Razor,具有部分视图的发布形式

ind*_*pal 14 c# asp.net asp.net-mvc razor asp.net-mvc-4

我是MVC 4和razor的新手.我有一个包含多个部分视图的视图.由于部分视图的功能,我计划在其他视图中重用这些视图.

我的模型是复杂对象的集合,例如:

    public class EmployeeInfo
    {
        public EmployeeContactInfo contactInfo { get; set; }
        public List<TelephoneInfo> phoneDetails { get; set; }
        public AddressDetails addressDetails { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我的主视图的模式是EmployeeInfo和其他部分的观点有模型作为TelephoneInfo,EmployeeContactInfoAddressDetails分别.

我尝试使用RenderPartial,RenderActionPartial加载我的部分视图,例如:

    @using (Html.BeginForm())
    {
    @Html.Partial("ContactInfo",Model.contactInfo)
    }
Run Code Online (Sandbox Code Playgroud)

提交主表单时,主模型没有部分视图的更新值.

我搜索了这个并找到了以下2个提出的解决方案:

  1. 使用EditorFor- 它工作,模型得到更新,但我不仅收集了文本框,还有其他具有一些内部操作的控件(如搜索地址),我还需要在其他地方重用相同的局部视图(比如用户控件)经典ASP.NET)

  2. 使用RenderAction而不是RenderPartial- 它对我不起作用.

如果我出错或理解错误,请告诉我.

Jas*_*ans 25

另一种选择是创建一个编辑器模板.例如,在主视图中:

@using (Html.BeginForm())
{
    @(Html.EditorFor(m => m.ContactInfo))
}
Run Code Online (Sandbox Code Playgroud)

现在,在Views/Shared文件夹(或Views/ControllerName文件夹,例如Views/Home)中,创建一个名为"EditorTemplates"的新文件夹.在该新文件夹中创建一个名为EmployeeContactInfo.cshtml(提示的cshtml视图文件,例如string,cshtml的名称应该是数据类型名称,bool或者在这种情况下是您的客户联系信息类型).在该视图文件中,输入如下内容:

@model EmployeeContactInfo

@Html.LabelFor(m => m.Email)
@Html.TextBoxFor(m => m.Email)
Run Code Online (Sandbox Code Playgroud)

当您回发到控制器时,这些值将作为返回模型的一部分包含在您的手中.


Dan*_*ele 7

问题是你的主要表单期望名为contactInfo.property的元素,可能在你部分生成的名称是没有正确标识符的属性,这个问题会导致MVC的默认模型绑定器出现问题.您可以创建自定义模型绑定器,但需要努力工作,或者您有两种方法可以用较少的工作来解决问题.

1.强制生成元素的名称

例如,如果您的EmployeeContactInfo类包含字符串Address属性,则必须使用此帮助程序:

@Html.TextBox("contactInfo.Address", model.Address)
Run Code Online (Sandbox Code Playgroud)

这导致:

<input type="text" name="contactInfo.Address" id="contactInfo_Address" />
Run Code Online (Sandbox Code Playgroud)

代替:

@Html.TextBoxFor(m=> m.Address)
Run Code Online (Sandbox Code Playgroud)

这导致:

<input type="text" name="Address" id="Address" />
Run Code Online (Sandbox Code Playgroud)

2.通过整个模型:

如果传递整个模型,生成的名称将是正确的,因此您可以使用帮助程序:

@Html.TextBoxFor(m=> m.contactInfo.Address)
Run Code Online (Sandbox Code Playgroud)

这导致:

<input type="text" name="contactInfo.Address" id="contactInfo_Address" />
Run Code Online (Sandbox Code Playgroud)