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

时间:2013-08-24 16:38:30

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

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

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

    public class EmployeeInfo
    {
        public EmployeeContactInfo contactInfo { get; set; }
        public List<TelephoneInfo> phoneDetails { get; set; }
        public AddressDetails addressDetails { get; set; }
    }

我的主视图模型为EmployeeInfo,其他部分视图的模型分别为TelephoneInfoEmployeeContactInfoAddressDetails

我尝试使用RenderPartialRenderActionPartial来加载我的部分观点,例如:

    @using (Html.BeginForm())
    {
    @Html.Partial("ContactInfo",Model.contactInfo)
    }

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

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

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

  2. 使用RenderAction代替RenderPartial - 这对我不起作用。

  3. 如果我出错或了解错误,请告诉我。

3 个答案:

答案 0 :(得分:23)

另一种选择是创建editor template。例如,在主视图中:

@using (Html.BeginForm())
{
    @(Html.EditorFor(m => m.ContactInfo))
}

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

@model EmployeeContactInfo

@Html.LabelFor(m => m.Email)
@Html.TextBoxFor(m => m.Email)

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

答案 1 :(得分:6)

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

<强> 1。强制生成元素的名称

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

@Html.TextBox("contactInfo.Address", model.Address)

导致:

<input type="text" name="contactInfo.Address" id="contactInfo_Address" />

而不是:

@Html.TextBoxFor(m=> m.Address)

导致:

<input type="text" name="Address" id="Address" />

<强> 2。通过整个模型:

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

@Html.TextBoxFor(m=> m.contactInfo.Address)

导致:

<input type="text" name="contactInfo.Address" id="contactInfo_Address" />

答案 2 :(得分:-2)

“部分查看”页面的作用类似于“用户控制”

  1. 此处_login.cshtml是部分视图
  2. 如果您使用局部视图,则使用下划线,后跟名称:

    <div style = "margin:3%;"> @Html.Partial("~/Views/Shared/_login.cshtml",Model.login)
    </div>

  3. Model.login是一个对象。因此,在此对象中,您可以为任何页面分配值。

  4. 部分将根据对象值显示。