Pourquoi est-ce que je reçois l'erreur:
Les modèles ne peuvent être utilisés qu'avec l'accès aux champs, l'accès aux propriétés, les index de tableau à une seule dimension ou les expressions d'indexation personnalisées à paramètre unique
à ce 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>
à la ligne:
@Html.DisplayFor(modelItem=>item.Description.ToString().Substring(0,100))
Mettre à jour:
Problème résolu. J'ai ajouté à mon code:
@{
string parameterValue = item.Description.ToString().Substring(0, 100);
}
@Html.DisplayFor(modelItem=>parameterValue)
Mon nouveau 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>
}
Ce n'est qu'une possibilité. Juste par curiosité, existe-t-il une autre solution pour résoudre l'erreur?
Réponses:
J'ai eu le même problème avec quelque chose comme
J'ai résolu ça juste en faisant
Quand vous connaissez le truc, c'est simple.
La différence est que, dans le premier cas, j'ai passé une méthode en paramètre alors que dans le second cas, c'est une expression.
la source
Le modèle auquel il fait référence est l'assistant Html
DisplayFor
.DisplayFor s'attend à recevoir une expression conforme aux règles spécifiées dans le message d'erreur.
Vous essayez de passer une chaîne de méthodes à exécuter et cela ne plaît pas.
Ceci est un exemple parfait de l'endroit où le modèle MVVM (Model-View-ViewModel) est utile.
Vous pouvez regrouper votre
Trainer
classe de modèle dans une autre classe appeléeTrainerViewModel
qui pourrait fonctionner comme ceci:Vous modifieriez votre classe de modèle de vue pour contenir toutes les propriétés nécessaires pour afficher ces données dans la vue, d'où le nom ViewModel.
Ensuite, vous modifierez votre contrôleur pour renvoyer un
TrainerViewModel
objet plutôt qu'unTrainer
objet et changer votre déclaration de type de modèle dans votre fichier de vue enTrainerViewModel
trop.la source
J'ai rencontré un problème similaire avec le même message d'erreur en utilisant le code suivant:
J'ai trouvé une bonne réponse ici
Il s'avère que vous pouvez décorer la propriété de votre modèle avec un format d'affichage, puis appliquer une chaîne de format de données.
Assurez-vous d'importer la bibliothèque suivante dans votre modèle:
la source
Remplissez la couche de service avec le modèle, puis envoyez-le à la vue. Par exemple: ViewItem = ModelItem.ToString (). Substring (0,100);
la source