Отрисовка частичного вида с помощью динамической модели в Razor view engine и ASP.NET MVC 3
-
27-09-2019 - |
Вопрос
Когда я пытаюсь отобразить частичный вид, тип модели которого указан как:
@model dynamic
используя следующий код:
@{Html.RenderPartial("PartialView", Model.UserProfile);}
Я получаю следующее исключение:
'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.
Однако тот же код в файле .aspx работает безупречно.Есть какие-нибудь мысли?
Решение
Только что нашел ответ, похоже, что представление, в котором я размещал код RenderPartial, имело динамическую модель, и, таким образом, MVC не смог выбрать правильный метод для использования.Приведение модели в вызове RenderPartial к правильному типу устранило проблему.
Другие советы
Вместо того, чтобы лить модуль в рендерепартирном вызове, и поскольку вы используете бритву, вы можете изменить первую строку на своем представлении от
@model dynamic
к
@model YourNamespace.YourModelType
Это имеет преимущество работы на каждом @Html.Partial
Позвоните вам в поле зрения, а также дает вам Intellisense для свойств.
Также можно назвать как
@Html.Partial("_PartialView", (ModelClass)View.Data)
Есть еще одна причина, по которой это можно бросить, даже если вы не используете динамические / развертывание. Если вы делаете цикл, как это:
@foreach (var folder in ViewBag.RootFolder.ChildFolders.ToList())
{
@Html.Partial("ContentFolderTreeViewItems", folder)
}
В этом случае «var» вместо декларации типа бросит ту же ошибку, несмотря на то, что rootfolder имеет тип папки типа. Изменяя var к фактическому типу, проблема исчезает.
@foreach (ContentFolder folder in ViewBag.RootFolder.ChildFolders.ToList())
{
@Html.Partial("ContentFolderTreeViewItems", folder)
}
Вот способ пройти динамический объект к представлению (или частичному виду)
Добавьте следующий класс в любом месте в вашем решении (используйте пространство имен системного пространства, поэтому его готовы к использованию без необходимости добавлять какие-либо ссылки) -
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;
}
}
}
Когда вы отправляете модель на просмотр, преобразуйте его в расширение:
return View(new {x=4, y=6}.ToExpando());
Ваше здоровье
У меня была та же проблема, и в моем случае это то, что я сделал
@Html.Partial("~/Views/Cabinets/_List.cshtml", (List<Shop>)ViewBag.cabinets)
и частично вид
@foreach (Shop cabinet in Model)
{
//...
}
Я играл с C # код, который я случайно нашел решение вашей проблемы, ха-ха
Это код для основного взгляда:
`@model dynamic
@Html.Partial("_Partial", Model as IDictionary<string, object>)`
Затем на частичном представлении:
`@model dynamic
@if (Model != null) {
foreach (var item in Model)
{
<div>@item.text</div>
}
}`
Работал для меня, я надеюсь, что это тебе тоже поможет !!