Warum erhalte ich den Fehler:
Vorlagen können nur mit Feldzugriff, Eigenschaftszugriff, eindimensionalem Array-Index oder benutzerdefinierten Indexerausdrücken mit einzelnen Parametern verwendet werden
bei diesem Code:
@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>
in der Zeile:
@Html.DisplayFor(modelItem=>item.Description.ToString().Substring(0,100))
Aktualisieren:
Problem gelöst. Ich habe meinem Code hinzugefügt:
@{
string parameterValue = item.Description.ToString().Substring(0, 100);
}
@Html.DisplayFor(modelItem=>parameterValue)
Mein neuer Code:
@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>
}
Dies ist nur eine Möglichkeit. Gibt es aus Neugier eine andere Lösung, um den Fehler zu beheben?
c#
asp.net
string
asp.net-mvc-4
POIR
quelle
quelle
Antworten:
Ich hatte das gleiche Problem mit so etwas
Ich habe das nur dadurch gelöst
Wenn Sie den Trick kennen, ist es einfach.
Der Unterschied besteht darin, dass ich im ersten Fall eine Methode als Parameter übergeben habe, während es im zweiten Fall ein Ausdruck ist.
quelle
Die Vorlage, auf die es sich bezieht, ist der HTML-Helfer
DisplayFor
.DisplayFor erwartet einen Ausdruck, der den in der Fehlermeldung angegebenen Regeln entspricht.
Sie versuchen, eine auszuführende Methodenkette zu übergeben, die ihr nicht gefällt.
Dies ist ein perfektes Beispiel dafür, wo das MVVM-Muster (Model-View-ViewModel) nützlich ist.
Sie könnten Ihre
Trainer
Modellklasse in eine andere Klasse einbindenTrainerViewModel
, die ungefähr so funktioniert:Sie würden Ihre Ansichtsmodellklasse so ändern, dass sie alle Eigenschaften enthält, die zum Anzeigen dieser Daten in der Ansicht erforderlich sind, daher der Name ViewModel.
Dann würden Sie Ihren Controller so ändern, dass er ein
TrainerViewModel
Objekt anstelle einesTrainer
Objekts zurückgibt, und Ihre Modelltypdeklaration in Ihrer Ansichtsdatei ebenfalls ändernTrainerViewModel
.quelle
Ich bin auf ein ähnliches Problem mit derselben Fehlermeldung mit folgendem Code gestoßen:
Ich habe hier eine gute Antwort gefunden
Es stellt sich heraus, dass Sie die Eigenschaft in Ihrem Modell mit einem Anzeigeformat dekorieren und dann einen Datenformatstring anwenden können.
Stellen Sie sicher, dass Sie die folgende Bibliothek in Ihr Modell importieren:
quelle
Füllen Sie die Service-Schicht mit dem Modell aus und senden Sie es an die Ansicht. Zum Beispiel: ViewItem = ModelItem.ToString (). Teilzeichenfolge (0,100);
quelle