Dlaczego otrzymuję błąd:
Szablony mogą być używane tylko z dostępem do pola, dostępem do właściwości, indeksem tablicy jednowymiarowej lub niestandardowymi wyrażeniami indeksatora z jednym parametrem
pod tym kodem:
@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>
na linii:
@Html.DisplayFor(modelItem=>item.Description.ToString().Substring(0,100))
Aktualizacja:
Problem rozwiązany. Dodałem do mojego kodu:
@{
string parameterValue = item.Description.ToString().Substring(0, 100);
}
@Html.DisplayFor(modelItem=>parameterValue)
Mój nowy kod:
@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>
}
To tylko jedna możliwość. Czy dla ciekawości istnieje inne rozwiązanie problemu?
c#
asp.net
string
asp.net-mvc-4
POIR
źródło
źródło
Odpowiedzi:
Miałem ten sam problem z czymś takim
Rozwiązałem to po prostu robiąc
Kiedy znasz sztuczkę, to jest proste.
Różnica polega na tym, że w pierwszym przypadku przekazałem metodę jako parametr, podczas gdy w drugim przypadku jest to wyrażenie.
źródło
Szablon, do którego się odnosi, jest pomocnikiem HTML
DisplayFor
.DisplayFor oczekuje, że zostanie podane wyrażenie zgodne z regułami określonymi w komunikacie o błędzie.
Próbujesz przekazać łańcuch metod do wykonania i to się nie podoba.
Jest to doskonały przykład tego, gdzie przydaje się wzorzec MVVM (Model-View-ViewModel).
Możesz zawrzeć swoją
Trainer
klasę modelu w innej klasie o nazwie,TrainerViewModel
która może działać mniej więcej tak:Należy zmodyfikować klasę modelu widoku, aby zawierała wszystkie właściwości potrzebne do wyświetlenia tych danych w widoku, stąd nazwa ViewModel.
Następnie zmodyfikowałbyś kontroler, aby zwracał
TrainerViewModel
obiekt, a nieTrainer
obiekt, i zmienić deklarację typu modelu w pliku widoku naTrainerViewModel
również.źródło
Napotkałem podobny problem z tym samym komunikatem o błędzie przy użyciu następującego kodu:
Tu znalazłem dobrą odpowiedź
Okazuje się, że możesz udekorować właściwość w swoim modelu formatem wyświetlania, a następnie zastosować łańcuch danych.
Pamiętaj, aby zaimportować następującą bibliotekę do swojego modelu:
źródło
Wypełnij warstwę usługową modelem, a następnie wyślij go do widoku. Na przykład: ViewItem = ModelItem.ToString (). Substring (0,100);
źródło