Erreur "Les modèles ne peuvent être utilisés qu'avec l'accès aux champs, l'accès aux propriétés, l'index de tableau à une seule dimension ou les expressions d'indexation personnalisées à paramètre unique"

107

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?

POIR
la source
3
Excellent! Votre solution a fonctionné pour moi, et c'est tellement simple. Ce serait bien si vous pouviez mettre votre solution comme réponse à la place comme mise à jour et l'accepter. puisque nous regardons généralement les réponses acceptées.
Dush

Réponses:

101

J'ai eu le même problème avec quelque chose comme

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

J'ai résolu ça juste en faisant

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

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.

Daniel
la source
1
Parfait!!! Merci pour votre réponse @Daniel, je me suis battu avec cette
merde
75

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 Trainerclasse de modèle dans une autre classe appelée TrainerViewModelqui pourrait fonctionner comme ceci:

class TrainerViewModel
{
    private Trainer _trainer;

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

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

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 TrainerViewModelobjet plutôt qu'un Trainerobjet et changer votre déclaration de type de modèle dans votre fichier de vue en TrainerViewModeltrop.

Sean Airey
la source
5
+1 pour donner une interprétation correcte du message d'erreur et pour une meilleure solution que l'astuce décrite par les autres.
R. Schreurs
11

J'ai rencontré un problème similaire avec le même message d'erreur en utilisant le code suivant:

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

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:

using System.ComponentModel.DataAnnotations;
Rob
la source
0

Remplissez la couche de service avec le modèle, puis envoyez-le à la vue. Par exemple: ViewItem = ModelItem.ToString (). Substring (0,100);

RainyTears
la source