我是MVC 4和razor的新手。我有一个包含多个部分视图的视图。由于部分视图的功能,我计划在其他视图中重用这些视图。
我的模型是复杂对象的集合,例如:
public class EmployeeInfo
{
public EmployeeContactInfo contactInfo { get; set; }
public List<TelephoneInfo> phoneDetails { get; set; }
public AddressDetails addressDetails { get; set; }
}
我的主视图模型为EmployeeInfo
,其他部分视图的模型分别为TelephoneInfo
,EmployeeContactInfo
和AddressDetails
。
我尝试使用RenderPartial
,RenderAction
和Partial
来加载我的部分观点,例如:
@using (Html.BeginForm())
{
@Html.Partial("ContactInfo",Model.contactInfo)
}
提交主表单时,主模型没有部分视图的更新值。
我搜索了这个并找到了以下2个提出的解决方案:
使用EditorFor
- 它有效并且模型得到更新但我不仅收集了文本框,还收集了其他具有一些内部操作(如搜索地址)的控件,我还需要重用它们其他地方的部分视图(如经典ASP.NET中的用户控件)
使用RenderAction
代替RenderPartial
- 这对我不起作用。
如果我出错或了解错误,请告诉我。
答案 0 :(得分:23)
另一种选择是创建editor template。例如,在主视图中:
@using (Html.BeginForm())
{
@(Html.EditorFor(m => m.ContactInfo))
}
现在,在Views / Shared文件夹(或Views / ControllerName文件夹,例如Views / Home)中,创建一个名为“EditorTemplates”的新文件夹。在该新文件夹中创建名为EmployeeContactInfo.cshtml
的cshtml视图文件(提示,cshtml的名称应为数据类型名称,例如string
,bool
或在此情况下为您的客户联系信息类型)。在该视图文件中,输入如下内容:
@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)
“部分查看”页面的作用类似于“用户控制”
如果您使用局部视图,则使用下划线,后跟名称:
<div style = "margin:3%;">
@Html.Partial("~/Views/Shared/_login.cshtml",Model.login)
</div>
Model.login是一个对象。因此,在此对象中,您可以为任何页面分配值。
部分将根据对象值显示。