这是场景: - 我有一份产品清单。 - 每个产品都有许多部件。 - 零件有两种类型:MAIN和OPTIONAL。
我想提供产品主要部分的清单。会是什么声明?
我目前正在使用此语句但返回错误:
@Html.DisplayFor(p => p.Products.FirstOrDefault().Parts.Where(i => i.PartType == percobaan2.Models.PartType.Main))
谢谢你的帮助
更新:
这是错误:
System.Web.Mvc.dll中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理 附加信息:模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式。
其他信息:
此代码有效。但我需要添加where过滤器:
@Html.DisplayFor(p => p.Products.FirstOrDefault().Parts)
更新2:
这是我用mainparts属性更新的viewmodel类:
public class ProductDetail
{
public IEnumerable<Product> Products { get; set; }
public IEnumerable<Part> Parts { get; set; }
public IEnumerable<percobaan2.Models.Version> Versions { get; set; }
public IEnumerable<Category> Categories { get; set; }
public IEnumerable<Producer> Producers { get; set; }
public IEnumerable<Part> MainParts
{
get
{
return Parts.Where(p => p.PartType == PartType.Main);
}
}
}
答案 0 :(得分:2)
DisplayFor
无法在IEnumerable
上调用。它需要是模型的直接属性。
@Html.DisplayFor(p => p.Products.FirstOrDefault().Parts)
有效,因为Parts
是Product
类型中存在的属性。
如果您需要能够过滤部件但仍想要HTML帮助器,请定义另一个属性,如下所示:
public class Product
{
public IEnumerable<Part> MainParts
{
get
{
return Parts.Where(i => i.PartType == PartType.Main);
}
}
}
然后你可以使用
@Html.DisplayFor(p => p.Products.FirstOrDefault().MainParts)
如果您正在使用EF生成的类,只需将其设为部分类并按原样使用。