0

ビュー内には、エディター テンプレートをレンダリングするコード行があります。

ただし、次のエラーが返されます。

テンプレートは、フィールド アクセス、プロパティ アクセス、単一次元の配列インデックス、または単一パラメーターのカスタム インデクサー式でのみ使用できます。

これは、私が望むものを達成するための最もエレガントな方法のように思えますが、ビューのラムダ式がエディター テンプレートには複雑すぎることに気付きました。

誰かがこれを機能させる方法を提案したり、より良い方法を教えてくれますか?

意見

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

エディタ テンプレート 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; }
    }
}

ビューモデル

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

1 に答える 1

5

エラー メッセージがすべてを物語っています。厳密に型指定されたヘルパーで複雑なラムダ式を使用することはできません。プロパティ アクセスとインデクサー アクセス式のみがサポートされています。

誰かがこれを機能させる方法を提案したり、より良い方法を教えてくれますか?

もちろん、ビューモデルを使用して。

したがって、ビューでそのようなコードを記述する代わりに、ビューで使用できるビューモデルでプロパティを定義してください。

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

明らかに、ビュー モデルには、ビューに必要な情報のみが含まれます。多くても少なくてもありません。

于 2013-05-08T13:27:17.873 に答える