2013-05-08 30 views
0

在我看来,我有一行代码呈现编辑器模板。编辑器模板的Lambda表达式太复杂了

然而,返回错误:

模板只能与现场访问,属性访问,一维数组的索引,或者单参数定制索引表达式中使用。

这似乎是最优雅的方式来实现我想要的,但我认识到我的视图中的lambda表达式对编辑器模板来说太复杂。

任何人都可以建议如何使这项工作或建议我一个更好的方法吗?

查看

@Html.EditorFor(model => model.Approvers.Where(a => a.ApprovalCount > 0)) 

编辑模板

@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> 

编辑模板视图模型

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; } 
    } 
} 

视图模型

namespace Project.ViewModels 
{ 
    public class ChangeRequestViewModel 
    { 
     public virtual ICollection<AssignedApproverData> Approvers { get; set; } 
    } 
} 

回答

5

错误消息说,这一切:你不能使用复杂的lambda表达式使用强类型的辅助。仅支持属性访问和索引器访问表达式。

Can anybody suggest how to make this work or advise me of a better way?

通过使用当然的视图模型。

因此,继续前进,并定义你的视图模型的属性,你可以在你的视图中使用视图编写这样的代码来代替:

@Html.EditorFor(model => model.AcceptedApprovers) 

,你会对你的视图模型对应的属性:

public class ChangeRequestViewModel 
{ 
    public virtual ICollection<AssignedApproverData> AcceptedApprovers { get; set; } 
} 

,并在你的控制器动作正在呈现这个观点,你会从你的域模型填充这个属性:

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); 
} 

显然,视图模型将只包含视图所需的信息,而不是更多,而不是更少。