我对这个Rachel Appel blog帖子感兴趣,该帖子有一个引用ViewModel的View,并且在View中能够使用具有以下语法的Lambda表达式访问ViewModel的多个实体中的属性:
@Html.EditorFor(model => model.ViewModelEntityName.Property)
我能够访问各个ViewModel实体,但不能访问这些实体的属性。这是我的代码:
视图模型
public class PoliciesTrustsViewModel
{
public ICollection<Insurance> Policies { get; set; } //model in partial class generated by EF database first
public ICollection<Companies> Trusts { get; set; } //model in partial class generated by EF database first
public PoliciesTrustsViewModel(ICollection<Insurance> policies, ICollection<Companies> trusts)
{
Policies = policies;
Trusts = trusts;
}
控制器
public ActionResult Create()
{
ICollection<Insurance> policies = db.Insurance.ToList();
ICollection<Companies> trusts = db.Companies.ToList();
var myViewModel = new ViewModels.PoliciesTrustsViewModel(policies, trusts);
return View(myViewModel);
}
查看
我将模型引用设置为ViewModel:
@model IEnumerable<TrustsInsurance.ViewModels.PoliciesTrustsViewModel>
Lambda表达式将接受实体名称,但不允许单个实体中的属性。所以
@Html.EditorFor(model => model.Policies, new { htmlAttributes = new { @class = "form-control" } })
是允许的,但是
@Html.EditorFor(model => model.Policies.Property, new { htmlAttributes = new { @class = "form-control" } })
产生“不包含定义”错误。我尝试在剃刀中使用@foreach (var item in Model)
循环以及许多不同的演员,但没有销售。那么如何使用lambda表达式跨多个模型访问属性呢?任何朝着正确方向的推动都会非常感激。
答案 0 :(得分:1)
我避免在您的ViewModel中嵌入EF实体。根据要点:
关系数据很好,但除非你需要&#34;一切&#34;如果构成一个相关实体,那么将数据简化为POCO会更好。传递实体引用通常会导致痛苦。懒惰加载dbContext范围,或者是急于加载&#34;所有东西&#34;万一它可能需要在路上,在提交时将实体重新关联到dbContexts ..更糟糕的是它的价值。
例如,给定一个视图模型,如果我只关心FK和一个漂亮的名称,我想要一个像Policy和Trusts(Companies)这样的东西的列表,我的ViewModel将包含List<PolicySummary>
和{ {1}}其中PolicySummary是包含PolicyId和DisplayName的POCO。 CompanySummary可能包含CompanyId,CompanyName和Address。 (作为格式化的邮件地址块)这些POCO是轻量级的,并且通常可以在简单的.Select()语句中饱和。在往返中,您可以从相关的dbContext中检索要在操作中关联的ID。
答案 1 :(得分:0)
我只对博客进行了快速扫描,但最明显的区别是博客中的示例在ViewModel中有一个Customer实例,但上面的示例包含两个ICollections。
因此,Razor试图找到一个不是针对一个Policy.Property的编辑器,而是针对它们的整个集合,以及失败的外观。
尝试使用相同的逻辑,但在ViewModel中使用Policy and Trust的单个实例,您应该获得渲染视图。
如果您需要能够编辑集合,则需要进行一些谷歌搜索。你应该在SO上找到帮助你的例子。