エラーが表示される理由:
テンプレートは、フィールドアクセス、プロパティアクセス、単一次元配列インデックス、または単一パラメーターのカスタムインデクサー式でのみ使用できます
このコードで:
@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つの可能性にすぎません。好奇心のために、エラーを解決する別の解決策はありますか?
私は次のようなもので同じ問題を抱えていました
@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番目のケースでは式だということです。
それが参照しているテンプレートは、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
に変更します。
私は次のコードを使用して同じエラーメッセージで同様の問題に遭遇しました:
@Html.DisplayFor(model => model.EndDate.Value.ToShortDateString())
私は ここで良い答え を見つけました
モデルのプロパティをdisplayformatで装飾してから、dataformatstringを適用できることがわかりました。
次のライブラリをモデルにインポートしてください:
using System.ComponentModel.DataAnnotations;
サービスレイヤーにモデルを入力し、それをビューに送信します。例:ViewItem = ModelItem.ToString()。Substring(0,100);