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順序を制御したいと考えています。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>
}
于 2012-05-24T04:12:43.847 に答える