Html.EditorFor() 中的过滤器列表

本文关键字:过滤器 列表 EditorFor Html | 更新日期: 2023-09-27 18:31:40

我只是想知道在将过滤器用于集合时是否有办法将过滤器应用于@Html.EditorFor()。

假设我有以下代码:编辑器模板/Foo

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

编辑器模板/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。

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

Html.EditorFor() 中的过滤器列表

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

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

一种方法是在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,模型绑定将选取它。

我在尝试解决类似问题时研究了这个问题。我需要创建一个按类别排序的网格,同时按类别过滤主模型集合以显示在每个类别标题下。我为整个视图模型创建了一个编辑器模板,并从视图中调用 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()

编辑器模板 - 这是我们处理整个视图模型并进行过滤的地方。文件名是共享/编辑器文件夹中的 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)
}