"템플릿은 필드 액세스, 속성 액세스, 단일 차원 배열 인덱스 또는 단일 매개 변수 사용자 지정 인덱서 식에만 사용할 수 있습니다."오류


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

참조하는 템플릿은 Html 도우미 DisplayFor입니다.

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())

여기서 좋은 답을 찾았 습니다

displayformat을 사용하여 모델의 속성을 장식 한 다음 dataformatstring을 적용 할 수 있습니다.

다음 lib를 모델로 가져와야합니다.

using System.ComponentModel.DataAnnotations;

0

모델로 서비스 계층을 채운 다음보기로 보냅니다. 예 : ViewItem = ModelItem.ToString (). Substring (0,100);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.