Html.EditorFor()中的筛选器列表

时间:2012-04-18 07:16:52

标签: c# asp.net-mvc-3

我只是想知道在将它用于集合时是否有办法将过滤器应用于@ 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)

然而,在尝试之后我的手指交叉后,我被提醒生活并不总是简单的,并且由于“模板只能用于字段访问,属性访问,单维数组索引,因此返回了InvalidOperationException”或单参数自定义索引器表达式。“

有关我如何正确处理手头问题的任何建议?

3 个答案:

答案 0 :(得分:2)

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

*这假设group是一个字符串,根据需要更改类型

答案 1 :(得分: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的另一个参数。在模型对象上使用该属性可能会导致另一个开发人员部分的混淆。他们怎么知道这个特定FooDetails对象的model可能只是整体的一部分?

另一方面,如果这一切都不重要,您也可以只设置变量名fooDetails而不是filteredFooDetails,模型绑定会选择它。

答案 2 :(得分: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)
}