Errore "I modelli possono essere utilizzati solo con accesso ai campi, accesso alle proprietà, indice di array monodimensionale o espressioni dell'indicizzatore personalizzato a parametro singolo"


107

Perché ricevo l'errore:

I modelli possono essere utilizzati solo con accesso ai campi, accesso alle proprietà, indice di matrice a dimensione singola o espressioni dell'indicizzatore personalizzato a parametro singolo

a questo codice:

@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 linea:

@Html.DisplayFor(modelItem=>item.Description.ToString().Substring(0,100))

Aggiornare:

Problema risolto. Ho aggiunto al mio codice:

  @{
string parameterValue = item.Description.ToString().Substring(0, 100); 
          }
          @Html.DisplayFor(modelItem=>parameterValue)

Il mio nuovo codice:

@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>
}

Questa è solo una possibilità. Solo per curiosità c'è un'altra soluzione per risolvere l'errore?


3
Eccellente! La tua soluzione ha funzionato per me ed è così semplice. Sarebbe bello se tu potessi mettere la tua soluzione come risposta invece come aggiornamento e accettarla. poiché di solito guardiamo le risposte accettate.
Dush

Risposte:


101

Ho avuto lo stesso problema con qualcosa di simile

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

L'ho risolto semplicemente facendo

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

Quando conosci il trucco, è semplice.

La differenza è che, nel primo caso, ho passato un metodo come parametro mentre nel secondo caso è un'espressione.


1
Perfetto!!! Grazie per la tua risposta @Daniel, ho litigato con questa
merda

75

Il modello a cui si riferisce è l'helper Html DisplayFor.

DisplayFor prevede che venga fornita un'espressione conforme alle regole specificate nel messaggio di errore.

Stai cercando di passare una catena di metodi da eseguire e non ti piace.

Questo è un perfetto esempio di dove il pattern MVVM (Model-View-ViewModel) è utile.

Potresti racchiudere la tua Trainerclasse modello in un'altra classe chiamata TrainerViewModelche potrebbe funzionare in questo modo:

class TrainerViewModel
{
    private Trainer _trainer;

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

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

Modificare la classe del modello di visualizzazione per contenere tutte le proprietà necessarie per visualizzare quei dati nella vista, da cui il nome ViewModel.

Quindi modifichi il tuo controller per restituire un TrainerViewModeloggetto piuttosto che un Traineroggetto e modifichi anche la dichiarazione del tipo di modello nel file di visualizzazione TrainerViewModel.


5
+1 per dare una corretta interpretazione del messaggio di errore e per una soluzione migliore rispetto al trucco descritto dagli altri.
R. Schreurs

11

Ho riscontrato un problema simile con lo stesso messaggio di errore utilizzando il seguente codice:

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

Ho trovato una buona risposta qui

Risulta che puoi decorare la proprietà nel tuo modello con un displayformat quindi applicare una dataformatstring.

Assicurati di importare la seguente libreria nel tuo modello:

using System.ComponentModel.DataAnnotations;

0

Compila il livello di servizio con il modello e quindi invialo alla vista. Ad esempio: ViewItem = ModelItem.ToString (). Substring (0,100);

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.