una - Renderizar vista parcial con modelo dinámico en Razor view engine y ASP.NET MVC 3
razor mvc (6)
Acabo de encontrar la respuesta, parece que la vista donde estaba colocando el código de RenderPartial tenía un modelo dinámico, y por lo tanto, MVC no pudo elegir el método correcto para usar. Lanzar el modelo en la llamada de RenderPartial al tipo correcto solucionó el problema.
Cuando intento renderizar una vista parcial cuyo tipo de modelo se especifica como:
@model dynamic
usando el siguiente código:
@{Html.RenderPartial("PartialView", Model.UserProfile);}
Obtengo la siguiente excepción:
''System.Web.Mvc.HtmlHelper<dynamic>'' has no applicable method named ''RenderPartial'' but appears to have an extension method by that name. Extension methods cannot be dynamically dispatched. Consider casting the dynamic arguments or calling the extension method without the extension method syntax.
Sin embargo, el mismo código en un archivo .aspx funciona perfectamente. ¿Alguna idea?
Aquí hay una forma de pasar un objeto dinámico a una vista (o vista parcial)
Agregue la siguiente clase en cualquier lugar de su solución (use el espacio de nombres del sistema, por lo que está listo para usar sin tener que agregar ninguna referencia) -
namespace System
{
public static class ExpandoHelper
{
public static ExpandoObject ToExpando(this object anonymousObject)
{
IDictionary<string, object> anonymousDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(anonymousObject);
IDictionary<string, object> expando = new ExpandoObject();
foreach (var item in anonymousDictionary)
expando.Add(item);
return (ExpandoObject)expando;
}
}
}
Cuando envíe el modelo a la vista, conviértalo a Expando:
return View(new {x=4, y=6}.ToExpando());
Aclamaciones
En lugar de lanzar el modelo en la llamada RenderPartial, y como está usando una afeitadora, puede modificar la primera línea en su vista desde
@model dynamic
a
@model YourNamespace.YourModelType
Esto tiene la ventaja de trabajar en cada llamada @Html.Partial
que tenga en la vista, y también le da intellisense para las propiedades.
Hay otra razón por la que se puede lanzar, incluso si no está utilizando Dynamic / ExpandoObject. Si estás haciendo un ciclo, así:
@foreach (var folder in ViewBag.RootFolder.ChildFolders.ToList())
{
@Html.Partial("ContentFolderTreeViewItems", folder)
}
En ese caso, la "var" en lugar de la declaración de tipo arrojará el mismo error, a pesar del hecho de que RootFolder es del tipo "Carpeta. Al cambiar la var al tipo real, el problema desaparece.
@foreach (ContentFolder folder in ViewBag.RootFolder.ChildFolders.ToList())
{
@Html.Partial("ContentFolderTreeViewItems", folder)
}
También se puede llamar como
@Html.Partial("_PartialView", (ModelClass)View.Data)
Tuve el mismo problema y en mi caso esto es lo que hice
@Html.Partial("~/Views/Cabinets/_List.cshtml", (List<Shop>)ViewBag.cabinets)
y en vista parcial
@foreach (Shop cabinet in Model)
{
//...
}