[c#] “템플릿은 필드 액세스, 속성 액세스, 단일 차원 배열 인덱스 또는 단일 매개 변수 사용자 지정 인덱서 식에만 사용할 수 있습니다.”오류
오류가 발생하는 이유 :
템플릿은 필드 액세스, 속성 액세스, 단일 차원 배열 인덱스 또는 단일 매개 변수 사용자 지정 인덱서 식에만 사용할 수 있습니다.
이 코드에서 :
@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-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
.
답변
다음 코드를 사용하여 동일한 오류 메시지로 비슷한 문제가 발생했습니다.
@Html.DisplayFor(model => model.EndDate.Value.ToShortDateString())
displayformat을 사용하여 모델의 속성을 장식 한 다음 dataformatstring을 적용 할 수 있습니다.
다음 lib를 모델로 가져와야합니다.
using System.ComponentModel.DataAnnotations;
답변
모델로 서비스 계층을 채운 다음보기로 보냅니다. 예 : ViewItem = ModelItem.ToString (). Substring (0,100);