Error "Template hanya dapat digunakan dengan akses kolom, akses properti, indeks array dimensi tunggal, atau ekspresi pengindeks kustom parameter tunggal"

107

Mengapa saya menerima kesalahan:

Template hanya dapat digunakan dengan akses kolom, akses properti, indeks array dimensi tunggal, atau ekspresi pengindeks kustom parameter tunggal

pada kode ini:

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

pada baris:

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

Memperbarui:

Masalah terpecahkan. Saya menambahkan ke kode saya:

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

Kode baru saya:

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

Ini hanya satu kemungkinan. Hanya karena penasaran, apakah ada solusi lain untuk mengatasi kesalahan tersebut?

POIR
sumber
3
Luar biasa! Solusi Anda berhasil untuk saya, dan itu sangat sederhana. Alangkah baiknya jika Anda dapat menempatkan solusi Anda sebagai jawaban, bukan sebagai pembaruan, dan menerimanya. karena kami biasanya melihat jawaban yang diterima.
Dush

Jawaban:

101

Saya memiliki masalah yang sama dengan sesuatu seperti

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

Saya menyelesaikan ini hanya dengan melakukan

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

Ketika Anda mengetahui triknya, itu sederhana.

Perbedaannya adalah, dalam kasus pertama, saya meneruskan metode sebagai parameter sedangkan dalam kasus kedua, ini adalah ekspresi.

Daniel
sumber
1
Sempurna!!! Terima kasih atas jawaban Anda @Daniel, saya berjuang dengan omong kosong ini selama berjam
JSEvgeny
75

Template yang dirujuknya adalah helper Html DisplayFor.

DisplayFor mengharapkan untuk diberikan ekspresi yang sesuai dengan aturan seperti yang ditentukan dalam pesan kesalahan.

Anda mencoba meneruskan rantai metode untuk dieksekusi dan itu tidak menyukainya.

Ini adalah contoh sempurna di mana pola MVVM (Model-View-ViewModel) berguna.

Anda bisa menyelesaikan Trainerkelas model Anda di kelas lain yang disebut TrainerViewModelyang bisa bekerja seperti ini:

class TrainerViewModel
{
    private Trainer _trainer;

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

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

Anda akan mengubah kelas model tampilan Anda untuk memuat semua properti yang diperlukan untuk menampilkan data itu dalam tampilan, oleh karena itu dinamai ViewModel.

Kemudian Anda akan memodifikasi pengontrol Anda untuk mengembalikan TrainerViewModelobjek daripada Trainerobjek dan mengubah deklarasi tipe model Anda di file tampilan TrainerViewModeljuga.

Sean Airey
sumber
5
1 untuk memberikan interpretasi yang tepat dari pesan kesalahan dan untuk solusi yang lebih baik daripada trik yang dijelaskan oleh yang lain.
R. Schreurs
11

Saya mengalami masalah serupa dengan pesan kesalahan yang sama menggunakan kode berikut:

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

Saya menemukan jawaban yang bagus di sini

Ternyata Anda bisa mendekorasi properti dalam model Anda dengan format tampilan kemudian menerapkan dataformatstring.

Pastikan untuk mengimpor lib berikut ke model Anda:

using System.ComponentModel.DataAnnotations;
rampok
sumber
0

Isi lapisan layanan dengan model dan kemudian kirimkan ke tampilan. Misalnya: ViewItem = ModelItem.ToString (). Substring (0,100);

RainyTears
sumber