Pergunta

Quando tento renderizar uma visão parcial cujo tipo de modelo é especificado como:

@model dynamic

Usando o seguinte código:

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

Eu recebo a seguinte exceção:

'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.

No entanto, o mesmo código em um arquivo .aspx funciona perfeitamente. Alguma ideia?

Foi útil?

Solução

Acabei de encontrar a resposta, parece que a visualização em que eu estava colocando o código de renderização tinha um modelo dinâmico e, portanto, o MVC não pôde escolher o método correto a ser usado. Lançar o modelo na chamada de renderização para o tipo correto corrigiu o problema.

fonte: Usando html.renderParcial () em arquivos ASCX

Outras dicas

Em vez de lançar o modelo na chamada renderpartial e, como você está usando Razor, você pode modificar a primeira linha em sua visão de

@model dynamic

para

@model YourNamespace.YourModelType

Isso tem a vantagem de trabalhar em cada @Html.Partial Ligue para que você tenha na vista e também lhe dá intellisense para as propriedades.

Também pode ser chamado como

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

Há outra razão pela qual isso pode ser jogado, mesmo que você não esteja usando dinâmico/expandOObject. Se você está fazendo um loop, assim:

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

Nesse caso, o "var" em vez da declaração do tipo apresentará o mesmo erro, apesar do fato de que o rootfolder ser da pasta do tipo ". Ao alterar o VAR para o tipo real, o problema desaparece.

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

Aqui está uma maneira de passar um objeto dinâmico para uma visão (ou visualização parcial)

Adicione a aula a seguir em qualquer lugar da sua solução (use namespace do sistema, então está pronto para uso sem precisar adicionar referências) -

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

        }
    }

Quando você envia o modelo para a visualização, converta -o para expandir:

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

Felicidades

Eu tive o mesmo problema e, no meu caso

@Html.Partial("~/Views/Cabinets/_List.cshtml", (List<Shop>)ViewBag.cabinets)

e em visão parcial

@foreach (Shop cabinet in Model)
{
    //...
}

Eu estava brincando com o código C# e acidentalmente encontrei a solução para o seu problema haha

Este é o código para a visão principal:

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

Então, na visão parcial:

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

Funcionou para mim, espero que isso te ajude também !!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top