2012-04-18 7 views
2

コレクション用に@ Html.EditorFor()にフィルタを適用する方法があるかどうかは不思議でした。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) 

しかし、それを試している間に指を横切った後、私は人生が常に単純ではなく、 "テンプレートはフィールドアクセス、プロパティアクセス、一次元配列インデックスのみで使用できるので、InvalidOperationExceptionを返すことを思い出しました。単一パラメータのカスタムインデクサ式。

どのように私が手元の問題に適切にアプローチするかについての提案はありますか?

答えて

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); 

EDIT

を、これは結合モデルを中断します。もう一方の端で値を取得できるようにするには、コントローラメソッドはモデルとfilteredFooDetailsの別の引数の両方を受け入れる必要があります。モデルオブジェクトのプロパティを使用すると、別の開発者の部品に混乱が生じる可能性があります。この特定のmodelオブジェクトのFooDetailsが全体のサブセットにすぎないかもしれないことを彼らはどのように知っていましたか?

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

+0

は、ネーミングは正しくないことになり、あなたは私があなたのコメントに反応して私の答えを更新しSlick86 @コントローラ側 – Slick86

+0

に結合モデルを失います。 – parKing

1

Html.EditorForには、追加のビューデータを指定できるoverloadがあります。このパラメータを使用して条件を渡すことができます。

だからあなた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) 
} 

*このグループは私が見て必要な

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です。カテゴリヘッダーの下に表示する各項目のテンプレートを標準のエディターに呼び出します。これを行う

@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) 
} 
関連する問題