我需要允许客户从固定的字段集(地址,家庭电话,SSN,名字等等)中指定将按哪种顺序绘制哪些字段。
最佳做法是什么?我觉得像“DrawField”这样的HTML帮助器方法是合适的,但我可以在HTML帮助器方法的主体中使用Html.EditorFor等助手吗?当modelstate出现错误并重新显示表单时,是否会填充提交的值和错误?
“最安全”的方法似乎是一个丑陋的大循环:
foreach( Field f in FieldList)
{
if(f.Key == FieldKey.FirstName)
{
@Html.LabelFor(model => model.FirstName, StringResource("firstNameLabel"))
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
<br />
}
if(f.Key == FieldKey.LastName)
{
......
}
}
必须有更好的方法!
答案 0 :(得分:1)
由于字段列表是固定的,我只是在控制器中对它进行排序,并且在视图中只有n个区域将按照它们到达模型的顺序呈现字段。我将构建模型,使其包含相同对象的列表,但每个内容将有所不同(名字,姓氏等)。您可以将所需的元数据添加到模型中
@Html.LabelFor(model => model.Items[0].Prop, StringResource(model.Items[0].PropName))
@Html.EditorFor(model => model.Items[0].Prop)
...
这样你就不需要任何条件或循环了。它取而代之的是由数据驱动的通用区域
答案 1 :(得分:0)
虽然我没有尝试过,但您可以尝试为模型创建自定义编辑器/显示模板,以便对字段进行排序。
要了解模型模板的基本概念,请检查此链接http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html
<强>更新强>
我尝试过一个简单的例子。我们有Person
模型,我想控制显示FirstName
和LastName
的顺序。
public class Person
{
[Required(ErrorMessage = "The field is required")]
[Display(Name = "First Name:")]
public string FirstName { get; set; }
[Required(ErrorMessage = "The field is required")]
[Display(Name = "Last Name:")]
public string LastName { get; set; }
}
创建自定义编辑器模板Person.cshtml
并将其放在Views/Shared
文件夹中。因此,无论何时调用EditorFor
方法
Person
此模板将用于渲染。为简单起见,我将通过ViewBag
传递它们必须显示为字段数组的顺序。
@model RazorAndJson.Models.Person
@{
var fields = ViewBag.FieldsOrder != null
? ViewBag.FieldsOrder
: new[] { "FirstName", "LastName" };
}
@foreach(string field in fields)
{
<p>
@Html.Label(field)
@Html.Editor(field)
@Html.ValidationMessage(field)
</p>
}