codememo

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

tipmemo 2023. 5. 28. 20:48
반응형

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

오류가 표시되는 이유:

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

다음 코드에서:

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

이것은 오직 하나의 가능성입니다.단지 호기심으로 오류를 해결할 수 있는 다른 해결책이 있습니까?

저도 같은 문제를 가지고 있었습니다.

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

요령을 알면 간단합니다.

다른 점은 첫 번째 경우에는 매개변수로 메서드를 전달한 반면 두 번째 경우에는 식을 전달했다는 것입니다.

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

DisplayFor에는 오류 메시지에 지정된 규칙을 준수하는 식을 지정해야 합니다.

실행할 메서드 체인을 전달하려고 하는데 이를 좋아하지 않습니다.

이는 MVVM(Model-View-View Model) 패턴의 유용성을 보여주는 완벽한 예입니다.

당신은 당신의 것을 마무리할 수 있습니다.Trainer다른 클래스의 모델 클래스:TrainerViewModel다음과 같은 방식으로 작동할 수 있습니다.

class TrainerViewModel
{
    private Trainer _trainer;

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

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

뷰 모델 클래스를 수정하여 뷰에 데이터를 표시하는 데 필요한 모든 속성을 포함할 수 있습니다. 따라서 뷰 모델이라는 이름이 됩니다.

그런 다음 컨트롤러를 수정하여 다음을 반환합니다.TrainerViewModel보다 객관적인Trainer뷰 파일에서 모델 유형 선언을 다음으로 변경합니다.TrainerViewModel너무.

다음 코드를 사용하여 동일한 오류 메시지와 유사한 문제가 발생했습니다.

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

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

모델의 속성을 표시 형식으로 장식한 다음 데이터 형식 문자열을 적용할 수 있습니다.

다음 lib를 모델로 가져오십시오.

using System.ComponentModel.DataAnnotations;

사용하다@Html.Raw(item.Description.ToString().Substring(0,100))

그...ForHtmlHelper의 확장 메서드(예:DisplayFor,TextBoxFor,ElementFor등) 다른 것 없이 재산을 가져갑니다.자산이 없는 경우 비-For방법(예:Display,TextBox,Element등).

그...For확장 메서드는 속성의 이름을 따서 컨트롤의 이름을 지정하여 포스트백을 단순화하는 방법을 제공합니다.이것이 단순히 값이 아닌 표현이 필요한 이유입니다.이 포스트백 촉진에 관심이 없는 경우에는 ...을 사용하지 마십시오.For전혀 방법이 없습니다.

참고: 전화하는 것과 같은 일을 해서는 안 됩니다.ToString 모델.이 작업은 뷰 모델 내에서 수행해야 합니다.저는 많은 데모 프로젝트가 도메인 객체를 뷰에 바로 표시한다는 것을 알고 있습니다.제 경험에 따르면 도메인 엔티티의 데이터에 대한 형식 지정을 원하지 않는다고 가정하기 때문에 거의 작동하지 않습니다.도면요소를 뷰에서 직접 사용할 수 있는 항목으로 감싸는 뷰 모델을 만드는 것이 가장 좋습니다.이 뷰 모델의 대부분 속성은 이미 형식이 지정된 문자열이거나 요소 또는 화면표시 템플릿이 생성된 데이터여야 합니다.

서비스 계층에 모델을 입력한 다음 뷰로 보냅니다.예:ViewItem=ModelItem.ToString().부분 문자열(0,100);

DateTime을 Shortdate로 변환하는 올바른 구문은 다음과 같습니다.

    @foreach (var item in Model)
    {
        @{var endDate= !item.EndDate.ToShortDateString();}
        @Html.DisplayFor(m => endDate,)
    }

언급URL : https://stackoverflow.com/questions/21754071/templates-can-be-used-only-with-field-access-property-access-single-dimension

반응형