"เทมเพลตสามารถใช้ได้เฉพาะกับการเข้าถึงฟิลด์การเข้าถึงคุณสมบัติดัชนีอาร์เรย์มิติเดียวหรือนิพจน์ตัวทำดัชนีที่กำหนดเองพารามิเตอร์เดียว"


107

เหตุใดฉันจึงได้รับข้อผิดพลาด:

เทมเพลตสามารถใช้ได้เฉพาะกับการเข้าถึงฟิลด์การเข้าถึงคุณสมบัติดัชนีอาร์เรย์มิติเดียวหรือนิพจน์ตัวทำดัชนีที่กำหนดเองแบบพารามิเตอร์เดียว

ที่รหัสนี้:

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

ที่บรรทัด:

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

อัปเดต:

แก้ไขปัญหา. ฉันเพิ่มรหัสของฉัน:

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

รหัสใหม่ของฉัน:

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

นี่เป็นเพียงความเป็นไปได้เดียว เพียงเพื่อความอยากรู้มีวิธีอื่นในการแก้ไขข้อผิดพลาดหรือไม่?


3
ยอดเยี่ยม! โซลูชันของคุณใช้ได้ผลสำหรับฉันและมันก็ง่ายมาก คงจะดีไม่น้อยหากคุณสามารถใส่โซลูชันของคุณเป็นคำตอบแทนการอัปเดตและยอมรับได้ เนื่องจากเรามักจะดูคำตอบที่ยอมรับ
Dush

คำตอบ:


101

ฉันมีปัญหาเดียวกันกับบางสิ่งบางอย่างเช่น

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

ฉันแก้ไขสิ่งนี้ได้โดยการทำ

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

เมื่อคุณรู้เคล็ดลับง่ายๆ

ความแตกต่างคือในกรณีแรกฉันส่งวิธีการเป็นพารามิเตอร์ในขณะที่ในกรณีที่สองเป็นนิพจน์


1
เป๊ะ !!! ขอบคุณสำหรับคำตอบของคุณ @ Daniel ฉันต่อสู้กับเรื่องนี้มาหลายชั่วโมงแล้ว
JSEvgeny

75

DisplayForแม่แบบมันจะหมายถึงเป็นผู้ช่วย Html

DisplayFor คาดว่าจะได้รับนิพจน์ที่สอดคล้องกับกฎตามที่ระบุในข้อความแสดงข้อผิดพลาด

คุณกำลังพยายามส่งต่อในห่วงโซ่วิธีการที่จะดำเนินการและไม่ชอบ

นี่เป็นตัวอย่างที่สมบูรณ์แบบของรูปแบบ MVVM (Model-View-ViewModel) ที่มีประโยชน์

คุณสามารถสรุปTrainerคลาสโมเดลของคุณในคลาสอื่นที่เรียกTrainerViewModelว่าสามารถใช้งานได้ดังนี้:

class TrainerViewModel
{
    private Trainer _trainer;

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

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

คุณจะปรับเปลี่ยนคลาสโมเดลมุมมองของคุณเพื่อให้มีคุณสมบัติทั้งหมดที่จำเป็นในการแสดงข้อมูลนั้นในมุมมองดังนั้นชื่อ ViewModel

จากนั้นคุณจะปรับเปลี่ยนคอนโทรลเลอร์ของคุณเพื่อส่งคืนTrainerViewModelวัตถุแทนที่จะเป็นTrainerวัตถุและเปลี่ยนการประกาศประเภทโมเดลของคุณในไฟล์มุมมองของคุณTrainerViewModelด้วย


5
+1 สำหรับการตีความข้อความแสดงข้อผิดพลาดที่เหมาะสมและเป็นวิธีการแก้ปัญหาที่ดีกว่าเคล็ดลับที่อธิบายโดยคนอื่น ๆ
R. Schreurs

11

ฉันพบปัญหาที่คล้ายกันพร้อมข้อความแสดงข้อผิดพลาดเดียวกันโดยใช้รหัสต่อไปนี้:

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

ฉันพบคำตอบที่ดีที่นี่

ปรากฎว่าคุณสามารถตกแต่งคุณสมบัติในโมเดลของคุณด้วยรูปแบบการแสดงผลจากนั้นใช้ dataformatstring

อย่าลืมนำเข้า lib ต่อไปนี้ลงในโมเดลของคุณ:

using System.ComponentModel.DataAnnotations;

0

กรอกข้อมูลในชั้นบริการด้วยโมเดลจากนั้นส่งไปยังมุมมอง ตัวอย่างเช่น ViewItem = ModelItem ToString (). Substring (0,100);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.