Render vista parcial con el modelo dinámico en el motor de vista Maquinilla de afeitar y ASP.NET MVC 3

StackOverflow https://stackoverflow.com/questions/4047543

Pregunta

Cuando intento para hacer una vista parcial cuyo tipo de modelo se especifica como:

@model dynamic

mediante el código siguiente:

@{Html.RenderPartial("PartialView", Model.UserProfile);}

Me sale el 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 a la perfección. ¿Alguna idea?

¿Fue útil?

Solución

Sólo encontró la respuesta, parece que la vista donde estaba poniendo el código renderPartial tenía un modelo dinámico, y por lo tanto, MVC no podía elegir el método correcto para su uso. Vaciar el modelo de la llamada renderPartial al tipo correcto ha solucionado el problema.

Fuente: Usando Html.RenderPartial () en los archivos ascx

Otros consejos

En lugar de vaciar el modelo de la llamada renderPartial, y desde que está utilizando la maquinilla de afeitar, 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 tiene en la vista, y también le da IntelliSense para las propiedades.

También puede ser llamado como

@Html.Partial("_PartialView", (ModelClass)View.Data)

Hay otra razón por la que esto puede ser lanzado, incluso si no se está usando dinámica / ExpandoObject. Si usted está haciendo un bucle, como esto:

@foreach (var folder in ViewBag.RootFolder.ChildFolders.ToList())
{
    @Html.Partial("ContentFolderTreeViewItems", folder)
}

En este caso, el "var" en lugar de la declaración de tipo arrojará el mismo error, a pesar de que RootFolder es de tipo "carpeta. Al cambiar la var para el tipo real, el problema desaparece.

@foreach (ContentFolder folder in ViewBag.RootFolder.ChildFolders.ToList())
{
    @Html.Partial("ContentFolderTreeViewItems", folder)
}

Aquí hay una manera de pasar un objeto dinámico a una vista (o vista parcial)

Añadir el siguiente en cualquier clase en su solución (uso Sistema de espacio de nombres, por lo que su lista para usar sin tener que añadir ningún referencias) -

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

        }
    }

Al enviar el modelo a la vista, convertirla en Expansión:

    return View(new {x=4, y=6}.ToExpando());

Saludos

Yo tenía 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)
{
    //...
}

Yo estaba jugando con un código C # encontré accidentalmente la solución a su problema jaja

Este es el código de la vista principal:

`@model dynamic 
 @Html.Partial("_Partial", Model as IDictionary<string, object>)`

A continuación, en la vista parcial:

`@model dynamic 
 @if (Model != null) { 
   foreach (var item in Model) 
   { 
    <div>@item.text</div> 
   } 
  }`

Se trabajó para mí, espero que esto le ayudará también !!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top