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