我只是想知道在将它用于集合时是否有办法将过滤器应用于@ 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”或单参数自定义索引器表达式。“
有关我如何正确处理手头问题的任何建议?
答案 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)
}