Renderizar a visão parcial com modelo dinâmico no Razor View Engine e ASP.NET MVC 3
-
27-09-2019 - |
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?
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.
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 !!