使用 Lambda 表达式访问实体框架视图模型中的模型属性



我对这篇 Rachel Appel 博客文章很感兴趣,它有一个引用 ViewModel 的视图,并且在该视图中能够使用以下语法的 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);
}

视图

我将模型引用设置为视图模型:

@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 表达式跨多个模型访问属性呢?任何朝着正确方向的推动将不胜感激。

我会避免在您的视图模型中嵌入 EF 实体。根据要点:

  • 仅将要呈现的数据放入视图模型中。
  • 视图应指导 ViewModel 的属性,这样它更适合呈现和维护。

关系数据很好,但除非你需要构成相关实体的"一切",否则最好将数据简化为 POCO。传递实体引用通常会导致痛苦。延迟加载出 dbContext 范围,或者在将来可能需要的情况下急切加载"所有内容"的费用,在提交时将实体重新关联到 dbContexts。比它的价值更混乱。

例如,给定一个视图模型,如果我只关心 FK 和一个漂亮的名称,我想要一个像政策和信托(公司(之类的东西的列表,我的 ViewModel 将包含一个List<PolicySummary>List<CompanySummary>其中 PolicySummary 是一个包含 PolicyId 和 DisplayName 的 POCO。公司摘要可能包含公司 ID、公司名称和地址。(作为格式化的邮寄地址块( 这些 POCO 是轻量级的,并且通常可以在简单的 .选择(( 语句。在往返行程中,您具有要从相关 dbContext 中检索的 ID,以便在操作中关联。

我只快速浏览了博客,但最明显的区别是博客中的示例在 ViewModel 中有一个客户的实例,但您上面的示例包括两个 ICollection。

因此,Razor试图找到一个编辑器,不是为一个Policy.Property,而是为整个集合找到一个编辑器,并且从事情失败的外观来看。

尝试相同的逻辑,但在 ViewModel 中使用单个策略和信任实例,您应该获得呈现的视图。

如果您需要能够编辑集合,则需要进行一些谷歌搜索。 您应该在SO上找到示例来帮助您。

最新更新