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


107

エラーが表示されるのはなぜですか。

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

このコードで:

@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つの可能性にすぎません。好奇心のために、エラーを解決するための別の解決策はありますか?


3
優れた!あなたの解決策は私にとってうまくいきました、そしてそれはとても簡単です。ソリューションを更新ではなく回答として入れて、それを受け入れることができるといいですね。私たちは通常、受け入れられた答えを見るからです。
2015

回答:


101

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

@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番目のケースでは式であることです。


1
パーフェクト!!! あなたの答え@Danielためのありがとう、私は時間のために***このSで戦っていた
JSEvgeny

75

それが参照しているテンプレートは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


5
+1は、エラーメッセージを適切に解釈し、他の人が説明するトリックよりも優れた解決策を示します。
R. Schreurs 2017

11

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

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

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

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

必ず次のlibをモデルにインポートしてください。

using System.ComponentModel.DataAnnotations;

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.