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)

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

关于如何正确解决手头问题的任何建议?

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

解决它的一种方法是在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。我正在为每个项目调用标准编辑器模板,以显示在类别标题下。

@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 回答