14

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

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

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

我的主要视图的模型是EmployeeInfo,其他部分视图的模型TelephoneInfo分别为EmployeeContactInfoAddressDetails

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

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

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

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

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

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

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

4

3 回答 3

26

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

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

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

@model EmployeeContactInfo

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

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

于 2013-08-24T17:55:05.180 回答
8

问题是您的主表单需要名称为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" />
于 2013-08-24T17:28:22.173 回答
-2

部分视图页面的行为类似于用户控制

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

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

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

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

于 2013-12-26T14:54:38.500 回答