2013-05-08 38 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); 
} 

顯然,視圖模型將只包含視圖所需的信息,而不是更多,而不是更少。