8

オブジェクトのリストをテーブル形式にレンダリングし、値の編集を可能にする部分ビューがあります...

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %>

<% foreach (whoozit.Models.PictureModel p in Model)
           { %>

  <td>
  <%: Html.TextBox("name",p.name) %>
  <%: Html.ValidationMessage(p.name) %>
  </td>  

<% } %>

mvc2で強く型付けされたhtmlヘルパーを利用するために、これをリファクタリングしたいと思います。ラムダ式を作成する方法を理解するのに苦労していて、助けを期待していました。以下は私には完全に正しくないようです。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<whoozit.Models.PictureModel>>" %>

<% foreach (whoozit.Models.PictureModel p in Model)
           { %>

  <td>
  <%: Html.TextBoxFor(???) %>
  </td>  

<% } %>
4

4 に答える 4

8

まず第一に、ビューで反復するべきではありません。反復はループを意味し、ループはC#/ VB.NETを意味し、ビュー内のC#/VB.NETはスパゲッティコードにつながります。

エディタテンプレートを使用することをお勧めします。このようにして、ビューにループを記述する必要はありません。次のファイルをに追加します~/Views/Home/EditorTemplates/PictureModel.ascx

<%@ Control Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<whoozit.Models.PictureModel>" %>
<td>
    <%: Html.TextBoxFor(x => x.name) %>
    <%: Html.ValidationMessageFor(x => x.name) %>
</td>

パーシャルが。whoozit.Models.PictureModelの代わりに強く型付けされていることに注意してくださいIList<whoozit.Models.PictureModel>。残っているのは、メインビューからこの部分を含めることだけです。

<%: Html.EditorFor(x => x.Pictures) %>

メインビューモデルPicturesのタイプのプロパティはどこにありますか。IList<whoozit.Models.PictureModel>これにより、コレクションの各要素のパーシャルが自動的に呼び出されるため、ビューに醜いループを記述する必要がありません。

これは慣例に従って機能します。部分PictureModel.ascxはリスト要素の型名として呼び出され、~/Views/Home/EditorTemplatesまたは~/Views/Shared/EditorTemplatesフォルダーに配置される必要があります。

エディター/ディスプレイテンプレートを使用すると、ビューがよりエレガントになります。

備考:.NETでは、規則は大文字で始まるプロパティ名であるため、プロパティの名前を。に変更することをお勧めしnameますName。書いたり読んだりする方が自然だと感じます。

<%: Html.TextBoxFor(x => x.Name) %>
于 2010-09-15T20:58:43.983 に答える
2

forループを使用してモデルをループすることにより、強く型付けされたヘルパーメソッドを使用できます。これにより、「name」html属性も一意になるため、モデルバインダーは、保存状況で値をモデルにマップするのに役立ちます。

<% for (int i = 0; i < Model.Count; i++) { %>

  <%: Html.TextBoxFor(m => m[i].Name) %>
  <%: Html.TextBoxFor(m => m[i].SomethingElse) %>

<% } %>

詳細はこちら..http ://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

于 2010-12-19T19:56:34.520 に答える
1
<%= Html.TextBoxFor(p => p.name) %> 
于 2010-09-14T16:40:21.473 に答える
1

whoozit.Models.PictureModelアイテムのリストを期待するように部分ビューに指示しています。次に、foreachはPictureModelではなくwhoozit.Models.Pictureを探しています。以下は、私が通常このようなことをする方法です。列挙しようとしているリストが正しいタイプであることを確認してください。画像クラスがPictureModel内のコレクションからのものである場合は、Modelを実行していることを確認してください。foreachにあるものは何でも。

これを試して:

<% foreach(var p in Model) { %>
<td>
<%: Html.TextBoxFor(p => p.name) %>
<%: Html.ValidateFor(p => p.name) %>
</td>
<% } %>
于 2010-09-14T17:35:13.927 に答える