2012-04-18 48 views
2

我只是想知道是否有一種方法來將過濾器應用於@ Html.EditorFor()時,將其用於集合。在Html.EditorFor()中的過濾器列表

可以說我有下面的代碼: EditorTemplates /美孚

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

但是,在嘗試出去之後穿過我的手指之後,我被提醒說生活並不總是很簡單,並且由於「模板只能用於字段訪問,屬性訪問,單維數組索引或單參數自定義索引器表達式「。

關於如何正確處理手頭問題的任何建議?

回答

0

解決這個問題的方法之一是在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的模型和另一個參數。在模型對象上使用屬性可能會導致其他開發人員部分的混淆。他們怎麼會知道在這個特定的model對象上的FooDetails可能只是整個的一個子集?另一方面,如果沒有那麼重要,你也可以使變量名稱fooDetails而不是filteredFooDetails,模型綁定會將其選中。

+0

這樣做會導致命名是不正確的,你失去的模型遙控器側 – Slick86 2013-03-23 02:09:26

+0

@ Slick86我我的答案更新響應您的評論的結合。 – parKing 2013-03-25 17:25:12

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 - 這是我們工作的整體視圖模型,做濾波。文件名稱爲ViewIngredientPageModel.cshtml,位於shared/editortemplates文件夾中。我打電話給模板的標準編輯器,讓每個項目出現在類別標題下。

@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) 
}