Lỗi “Chỉ có thể sử dụng các mẫu với quyền truy cập trường, truy cập thuộc tính, chỉ mục mảng một chiều hoặc biểu thức trình lập chỉ mục tùy chỉnh một tham số”


107

Tại sao tôi nhận được lỗi:

Mẫu chỉ có thể được sử dụng với quyền truy cập trường, quyền truy cập thuộc tính, chỉ mục mảng một thứ nguyên hoặc biểu thức trình lập chỉ mục tùy chỉnh một tham số

tại mã này:

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

tai dong:

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

Cập nhật:

Vấn đề đã được giải quyết. Tôi đã thêm vào mã của mình:

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

Mã mới của tôi:

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

Đây chỉ là một khả năng. Chỉ vì tò mò là có một giải pháp khác để giải quyết lỗi?


3
Thông minh! Giải pháp của bạn đã làm việc cho tôi, và nó rất đơn giản. Sẽ thật tuyệt nếu bạn có thể đặt giải pháp của mình như một câu trả lời thay vì cập nhật và chấp nhận nó. vì chúng tôi thường xem xét các câu trả lời được chấp nhận.
Dush

Câu trả lời:


101

Tôi đã có cùng một vấn đề với một cái gì đó như

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

Tôi đã giải quyết điều này chỉ bằng cách làm

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

Khi bạn biết thủ thuật, thật đơn giản.

Sự khác biệt là, trong trường hợp đầu tiên, tôi chuyển một phương thức dưới dạng tham số trong khi trong trường hợp thứ hai, đó là một biểu thức.


1
Hoàn hảo!!! Thanx cho câu trả lời của bạn @Daniel, tôi đang chiến đấu với s này *** trong nhiều giờ
JSEvgeny

75

Mẫu mà nó đề cập đến là trình trợ giúp Html DisplayFor.

DisplayFor mong đợi được cung cấp một biểu thức tuân thủ các quy tắc như được chỉ định trong thông báo lỗi.

Bạn đang cố gắng truyền vào một chuỗi phương thức để được thực thi và nó không thích nó.

Đây là một ví dụ hoàn hảo về việc mẫu MVVM (Model-View-ViewModel) có ích.

Bạn có thể kết thúc Trainerlớp mô hình của mình trong một lớp khác được gọi là lớp TrainerViewModelcó thể hoạt động như sau:

class TrainerViewModel
{
    private Trainer _trainer;

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

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

Bạn sẽ sửa đổi lớp mô hình dạng xem của mình để chứa tất cả các thuộc tính cần thiết để hiển thị dữ liệu đó trong dạng xem, do đó có tên là ViewModel.

Sau đó, bạn sẽ sửa đổi bộ điều khiển của mình để trả về một TrainerViewModelđối tượng chứ không phải một Trainerđối tượng và thay đổi cả khai báo kiểu mô hình trong tệp dạng xem của bạn TrainerViewModel.


5
+1 để đưa ra giải thích phù hợp về thông báo lỗi và giải pháp tốt hơn thủ thuật được mô tả bởi những người khác.
R. Schreurs

11

Tôi đã gặp sự cố tương tự với cùng một thông báo lỗi bằng cách sử dụng mã sau:

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

Tôi đã tìm thấy một câu trả lời hay ở đây

Hóa ra bạn có thể trang trí thuộc tính trong mô hình của mình bằng một định dạng hiển thị, sau đó áp dụng một chuỗi dữ liệu.

Đảm bảo nhập lib sau vào mô hình của bạn:

using System.ComponentModel.DataAnnotations;

0

Điền vào lớp dịch vụ với mô hình và sau đó gửi nó đến chế độ xem. Ví dụ: ViewItem = ModelItem.ToString (). Substring (0,100);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.