使用Lambda表达式在View中访问实体框架ViewModel属性

时间:2017-07-12 20:48:05

标签: c# asp.net-mvc entity-framework linq lambda

我对这个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表达式跨多个模型访问属性呢?任何朝着正确方向的推动都会非常感激。

2 个答案:

答案 0 :(得分:1)

我避免在您的ViewModel中嵌入EF实体。根据要点:

  • 仅放置您将在ViewModel中呈现的数据。
  • 视图应该指向ViewModel的属性,这样它更适合渲染和维护。

关系数据很好,但除非你需要&#34;一切&#34;如果构成一个相关实体,那么将数据简化为POCO会更好。传递实体引用通常会导致痛苦。懒惰加载dbContext范围,或者是急于加载&#34;所有东西&#34;万一它可能需要在路上,在提交时将实体重新关联到db​​Contexts ..更糟糕的是它的价值。

例如,给定一个视图模型,如果我只关心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上找到帮助你的例子。