¿Por qué recibo el error?
Las plantillas solo se pueden usar con acceso a campo, acceso a propiedad, índice de matriz de una dimensión o expresiones de indexación personalizadas de un solo parámetro
en este código:
@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>
en línea:
@Html.DisplayFor(modelItem=>item.Description.ToString().Substring(0,100))
Actualizar:
Problema resuelto. Agregué a mi código:
@{
string parameterValue = item.Description.ToString().Substring(0, 100);
}
@Html.DisplayFor(modelItem=>parameterValue)
Mi nuevo código:
@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>
}
Ésta es solo una posibilidad. Solo por curiosidad, ¿hay otra solución para solucionar el error?
c#
asp.net
string
asp.net-mvc-4
POIR
fuente
fuente
Respuestas:
Tuve el mismo problema con algo como
Resolví esto simplemente haciendo
Cuando conoces el truco, es simple.
La diferencia es que, en el primer caso, pasé un método como parámetro mientras que en el segundo caso, es una expresión.
fuente
La plantilla a la que se refiere es el asistente Html
DisplayFor
.DisplayFor espera recibir una expresión que se ajuste a las reglas especificadas en el mensaje de error.
Está intentando pasar una cadena de métodos para que se ejecute y no le gusta.
Este es un ejemplo perfecto de dónde resulta útil el patrón MVVM (Model-View-ViewModel).
Podría terminar su
Trainer
clase modelo en otra clase llamadaTrainerViewModel
que podría funcionar de esta manera:Modificaría su clase de modelo de vista para que contenga todas las propiedades necesarias para mostrar esos datos en la vista, de ahí el nombre ViewModel.
Luego, modificaría su controlador para devolver un
TrainerViewModel
objeto en lugar de unTrainer
objeto y cambiaría su declaración de tipo de modelo en su archivo de vistaTrainerViewModel
también.fuente
Me encontré con un problema similar con el mismo mensaje de error usando el siguiente código:
Encontré una buena respuesta aquí
Resulta que puede decorar la propiedad en su modelo con un formato de visualización y luego aplicar una cadena de formato de datos.
Asegúrese de importar la siguiente biblioteca a su modelo:
fuente
Complete la capa de servicio con el modelo y luego envíelo a la vista. Por ejemplo: ViewItem = ModelItem.ToString (). Substring (0,100);
fuente