use*_*195 0 asp.net-mvc lambda entity-framework razor
在我看来,我有一行代码可以呈现一个编辑器模板.
但是,它返回错误:
模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式.
这似乎是实现我想要的最优雅的方式但我意识到我的视图中的lambda表达式对于编辑器模板来说太复杂了.
谁能建议如何做这项工作或建议我更好的方法?
视图
@Html.EditorFor(model => model.Approvers.Where(a => a.ApprovalCount > 0))
Run Code Online (Sandbox Code Playgroud)
编辑模板
@model Project.ViewModels.AssignedApproverData
<div class="span3">
<label class="checkbox inline">
@Html.HiddenFor(model => model.EmployeeID)
@Html.CheckBoxFor(model => model.Assigned)
@Html.DisplayFor(model => model.FullName)
</label>
</div>
Run Code Online (Sandbox Code Playgroud)
编辑模板ViewModel
using System;
using System.Collections.Generic;
using Project.Models;
namespace Project.ViewModels
{
public class AssignedApproverData
{
public string EmployeeID { get; set; }
public string FullName { get; set; }
public bool Assigned { get; set; }
public int ApprovalCount { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
视图模型
namespace Project.ViewModels
{
public class ChangeRequestViewModel
{
public virtual ICollection<AssignedApproverData> Approvers { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
错误消息说明了一切:您不能将复杂的lambda表达式与强类型助手一起使用.仅支持属性访问和索引器访问表达式.
谁能建议如何做这项工作或建议我更好的方法?
通过使用视图模型当然.
因此,继续在视图模型上定义一个可以在视图中使用的属性,而不是在视图中编写此类代码:
@Html.EditorFor(model => model.AcceptedApprovers)
Run Code Online (Sandbox Code Playgroud)
并且您将在视图模型上具有相应的属性:
public class ChangeRequestViewModel
{
public virtual ICollection<AssignedApproverData> AcceptedApprovers { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并且在呈现此视图的控制器操作中,您将从域模型填充此属性:
public ActionResult SomeAction()
{
var domainModel = ... fetch your domain model from your repository as usual
var viewModel = new ChangeRequestViewModel();
viewModel.AcceptedApprovers = domainModel.Approvers.Where(a => a.ApprovalCount > 0);
return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)
显然,视图模型将仅包含视图所需的信息,而不是更多,而不是更少.
| 归档时间: |
|
| 查看次数: |
321 次 |
| 最近记录: |