2

コレクションに使用するときに @Html.EditorFor() にフィルターを適用する方法があるかどうか疑問に思っていました。

次のコードがあるとしましょう: EditorTemplates/Foo

@model Foo
@Html.EditorFor(f = f.FooDetails)

EditorTemplates/FooDetail

@model FooDetail
@Html.LabelFor(f => f.Group)

@Html.LabelFor(f => f.Name)
@Html.Editorfor(f => f.Name)

私の最初の考えは、次のことです。

@Html.EditorFor(f = f.FooDetails.Where(x => x.Group == group)

しかし、試してみると、人生は必ずしも単純ではなく、「テンプレートはフィールド アクセス、プロパティ アクセス、1 次元配列インデックス、または single-パラメーター カスタム インデクサー式。"

当面の問題に適切に取り組む方法について何か提案はありますか?

4

3 に答える 3

2

Html.EditorForには、追加のビュー データを指定できるオーバーロードがあります。このパラメーターを介して基準を渡すことができます。

したがって、 EditorFor は次のようになります。

@Html.EditorFor(f = f.FooDetails, new { Group = group})

エディター テンプレート* は次のようになります。

@model FooDetail

@if ((string)ViewData["Group"] == Model.Group) {
    @Html.LabelFor(f => f.Group)
    @Html.LabelFor(f => f.Name)
    @Html.Editorfor(f => f.Name)
}

*これは、グループが文字列であることを前提としています。必要に応じてタイプを変更してください

于 2013-09-05T14:01:16.337 に答える
0

これにアプローチする 1 つの方法は、 の外側で別の変数を宣言することHtml.EditorForです。

を使用する代わりに@Html.EditorFor(f = f.FooDetails.Where(x => x.Group == group))、次のように言うことができます。

    var filteredFooDetails = Model.FooDetails.Where(x => x.Group == group));
    @Html.EditorFor(f => filteredFooDetails);

編集

コメントが述べたように、これはモデルバインディングを壊します。反対側で値を取得できるようにするには、コントローラー メソッドでモデルと の別の引数の両方を受け入れる必要がありますfilteredFooDetails。モデル オブジェクトでプロパティを使用すると、別の開発者側で混乱が生じる可能性があります。FooDetailsこの特定modelのオブジェクトが全体のサブセットにすぎない可能性があることをどうやって知るのでしょうか?

一方、それが問題にならない場合は、fooDetails代わりに変数名を作成することもできfilteredFooDetails、モデル バインディングがそれを取得します。

于 2012-04-18T14:02:01.507 に答える
0

同様の問題を解決しようとしているときに、この質問を見ました。各カテゴリの見出しの下に表示されるようにメイン モデル コレクションをカテゴリ別にフィルタリングしながら、カテゴリ別に並べ替えられたグリッドを作成する必要がありました。ビュー モデル全体のエディター テンプレートを作成し、ビューから Html.DisplayForModel() を呼び出します。

ページ ビュー モデル

namespace GoodHousekeeping.MVC.Models
{
  public class ViewIngredientPageModel
  {
    public IEnumerable<ViewIngredientModel> ViewIngredientModels { get; set; }
    public IEnumerable<ViewIngredientCategoryModel> 
                          ViewIngredientCategoryModels { get; set; }
  }
}

モデルを見る

namespace GoodHousekeeping.MVC.Models
{
  public class ViewIngredientModel
  {
    public int? IngredientId { get; set; }

    [DisplayName("Ingredient Name")]
    public string Name { get; set; }

    public int IngredientCategoryId { get; set; }

    #region navigation

    public ViewIngredientCategoryModel IngredientCategory { get; set; }

    #endregion
  }
}

メインビュー

@model GoodHousekeeping.MVC.Models.ViewIngredientPageModel

@Html.DisplayForModel()

EditorTemplate - これは、ビュー モデル全体に​​取り組んでおり、フィルタリングを行っている場所です。ファイル名は、shared/editortemplates フォルダー内の ViewIngredientPageModel.cshtml です。各項目がカテゴリ ヘッダーの下に表示されるように、標準の editorfor テンプレートを呼び出しています。

@model GoodHousekeeping.MVC.Models.ViewIngredientPageModel
@foreach (var category in Model.ViewIngredientCategoryModels)
{
    <p>@category.IngredientCategoryName</p>
    var category1 = category;
    var viewIngredientModels = (from i in Model.ViewIngredientModels
                 where i.IngredientCategoryId == category1.IngredientCategoryId
                 select i);

    @Html.DisplayFor(m => viewIngredientModels)
}
于 2013-09-22T15:58:42.230 に答える