"Şablonlar yalnızca alan erişimi, özellik erişimi, tek boyutlu dizi dizini veya tek parametreli özel dizin oluşturucu ifadeleriyle kullanılabilir" hatası


107

Neden hatayı alıyorum:

Şablonlar yalnızca alan erişimi, özellik erişimi, tek boyutlu dizi dizini veya tek parametreli özel dizin oluşturucu ifadeleriyle kullanılabilir

bu kodda:

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

çizgide:

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

Güncelleme:

Sorun çözüldü. Koduma ekledim:

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

Yeni kodum:

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

Bu sadece bir olasılıktır. Sadece merak için hatayı çözmek için başka bir çözüm var mı?


3
Mükemmel! Çözümünüz benim için çalıştı ve çok basit. Çözümünüzü güncelleme yerine bir cevap olarak koyup kabul etseniz iyi olur. çünkü genellikle kabul edilen cevaplara bakarız.
Dush

Yanıtlar:


101

Bir şeyle aynı sorunu yaşadım

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

Bunu sadece yaparak çözdüm

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

İşin püf noktasını bildiğiniz zaman, bu basittir.

Aradaki fark, ilk durumda bir yöntemi parametre olarak geçirdim, ikinci durumda ise bu bir ifade.


1
Mükemmel!!! Cevabınız için teşekkürler @Daniel, saatlerce bu *** ile kavga ettim
JSEvgeny

75

Başvurduğu şablon, Html yardımcısıdır DisplayFor.

DisplayFor, hata mesajında ​​belirtilen kurallara uyan bir ifade verilmesini bekler.

Yürütülecek bir yöntem zincirine geçmeye çalışıyorsunuz ve bundan hoşlanmıyor.

Bu, MVVM (Model-View-ViewModel) modelinin kullanışlı olduğu yerin mükemmel bir örneğidir.

Eğer sarabilirdiniz Trainerdenilen başka bir sınıfta modeli sınıfı TrainerViewModelböyle bir şey işe yarayabilir:

class TrainerViewModel
{
    private Trainer _trainer;

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

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

Görünüm modeli sınıfınızı, bu verileri görünümde görüntülemek için gereken tüm özellikleri, dolayısıyla ViewModel adını içerecek şekilde değiştirirsiniz.

Ardından, denetleyicinizi bir TrainerViewModelnesne yerine bir nesne döndürecek şekilde Trainerdeğiştirirsiniz ve görünüm dosyanızdaki model türü bildiriminizi TrainerViewModelde değiştirirsiniz.


5
+1 hata mesajını doğru bir şekilde yorumlamak ve diğerleri tarafından açıklanan hileden daha iyi bir çözüm sağlamak için.
R.Schreurs

11

Aşağıdaki kodu kullanarak aynı hata mesajıyla benzer bir sorunla karşılaştım:

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

Burada iyi bir cevap buldum

Modelinizdeki mülkü bir görüntü biçimiyle dekore edip ardından bir veri biçimi dizesi uygulayabileceğiniz ortaya çıktı.

Aşağıdaki kitaplığı modelinize aktardığınızdan emin olun:

using System.ComponentModel.DataAnnotations;

0

Hizmet katmanını modelle doldurun ve ardından görünüme gönderin. Örneğin: ViewItem = ModelItem.ToString (). Substring (0,100);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.