web-dev-qa-db-ja.com

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

エラーが表示される理由:

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

このコードで:

@model IEnumerable<ArtSchoolProject.Models.Trainer>

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_PageLayout.cshtml";
}

<h2>Index</h2>

<p>
@Html.ActionLink("Create New", "Create")
</p>
<ul class="trainers">


@foreach (var item in Model) {
<li>
  <div>
      <div class="left">
          <a href="@Url.Action("Details", "Details", new { id = item.ID })">
              <img src="~/Images/Trainer/@item.Picture" />
          </a>
      </div>
      <div class="right">
          @Html.ActionLink(item.Name,"Details",new {id=item.ID})
          <br />
          @Html.DisplayFor(modelItem=>@string. item.Description.ToString().Substring(0,100))
      </div>
  </div>
  </li>
  }

  </ul>

行で:

@Html.DisplayFor(modelItem=>item.Description.ToString().Substring(0,100))

更新:

問題が解決しました。コードに追加しました:

  @{
string parameterValue = item.Description.ToString().Substring(0, 100); 
          }
          @Html.DisplayFor(modelItem=>parameterValue)

私の新しいコード:

@foreach (var item in Model) {
<li>
  <div>
      <div class="left">
          <a href="@Url.Action("Details", "Details", new { id = item.ID })">
              <img src="~/Images/Trainer/@item.Picture" />
          </a>
      </div>
      <div class="right">
          @Html.ActionLink(item.Name,"Details",new {id=item.ID})
          <br />
          @{
string parameterValue = item.Description.ToString().Substring(0, 100); 
          }
          @Html.DisplayFor(modelItem=>parameterValue)
      </div>
  </div>
 </li>
}

これは1つの可能性にすぎません。好奇心のために、エラーを解決する別の解決策はありますか?

87
POIR

私は次のようなもので同じ問題を抱えていました

@foreach (var item in Model)
{
    @Html.DisplayFor(m => !item.IsIdle, "BoolIcon")
}

私はこれをするだけで解決しました

@foreach (var item in Model)
{
    var active = !item.IsIdle;
    @Html.DisplayFor(m => active , "BoolIcon")
}

トリックを知っていれば、それは簡単です。

違いは、最初のケースではメソッドをパラメーターとして渡したのに対して、2番目のケースでは式だということです。

74
Daniel

それが参照しているテンプレートは、HtmlヘルパーDisplayForです。

DisplayForは、エラーメッセージで指定されたルールに適合する式が与えられることを期待しています。

実行するメソッドチェーンを渡そうとしていますが、それが気に入らないのです。

これは、MVVM(Model-View-ViewModel)パターンが役立つ便利な例です。

Trainerモデルクラスを、TrainerViewModelと呼ばれる別のクラスでラップすると、次のように動作します。

class TrainerViewModel
{
    private Trainer _trainer;

    public string ShortDescription
    {
        get
        {
            return _trainer.Description.ToString().Substring(0, 100);
        }
    }

    public TrainerViewModel(Trainer trainer)
    {
        _trainer = trainer;
    }
}

ビューモデルクラスを変更して、ビューにそのデータを表示するために必要なすべてのプロパティ、つまりViewModelという名前を含めるようにします。

次に、TrainerViewModelオブジェクトではなくTrainerオブジェクトを返すようにコントローラーを変更し、ビューファイル内のモデルタイプ宣言をTrainerViewModelに変更します。

67
Sean Airey

私は次のコードを使用して同じエラーメッセージで同様の問題に遭遇しました:

@Html.DisplayFor(model => model.EndDate.Value.ToShortDateString())

私は ここで良い答え を見つけました

モデルのプロパティをdisplayformatで装飾してから、dataformatstringを適用できることがわかりました。

次のライブラリをモデルにインポートしてください:

using System.ComponentModel.DataAnnotations;
7
Rob

サービスレイヤーにモデルを入力し、それをビューに送信します。例:ViewItem = ModelItem.ToString()。Substring(0,100);

0
MSM19