使用可配置顺序在ASP.NET Razor视图中呈现字段

时间:2012-05-24 03:38:40

标签: asp.net asp.net-mvc-3 razor

我需要允许客户从固定的字段集(地址,家庭电话,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)
   {
      ......
   }
}

必须有更好的方法!

2 个答案:

答案 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模型,我想控制显示FirstNameLastName的顺序。

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>
}