1

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

一定有更好的办法!

4

2 回答 2

1

由于字段列表是固定的,我只需在控制器中对其进行排序,并且视图中只有 n 个区域,这些区域将按照字段到达模型的顺序呈现字段。我会构建模型,使其包含相同对象的列表,但每个对象的内容会有所不同(名字、姓氏等)。您可以将所需的任何元数据添加到模型中

@Html.LabelFor(model => model.Items[0].Prop, StringResource(model.Items[0].PropName))
@Html.EditorFor(model => model.Items[0].Prop)

……

这样你就不需要任何条件或循环。相反,它是由数据驱动的 n 个通用区域

于 2012-05-24T03:47:35.627 回答
0

虽然我没有尝试过,但您可以尝试为负责对字段进行排序的模型创建自定义编辑器/显示模板。

要了解有关模型模板的基本概念,请查看此链接http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.html

更新:

我试过一个简单的例子。我们有一个Person模型,我想控制FirstNameandLastName的显示顺序。

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>
}
于 2012-05-24T04:12:43.847 回答