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
,EmployeeContactInfo
和AddressDetails
分别.
我尝试使用RenderPartial
,RenderAction
并Partial
加载我的部分视图,例如:
@using (Html.BeginForm())
{
@Html.Partial("ContactInfo",Model.contactInfo)
}
Run Code Online (Sandbox Code Playgroud)
提交主表单时,主模型没有部分视图的更新值.
我搜索了这个并找到了以下2个提出的解决方案:
使用EditorFor
- 它工作,模型得到更新,但我不仅收集了文本框,还有其他具有一些内部操作的控件(如搜索地址),我还需要在其他地方重用相同的局部视图(比如用户控件)经典ASP.NET)
使用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)
当您回发到控制器时,这些值将作为返回模型的一部分包含在您的手中.
问题是你的主要表单期望名为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)