Отрисовка частичного вида с помощью динамической модели в Razor view engine и ASP.NET MVC 3

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

Вопрос

Когда я пытаюсь отобразить частичный вид, тип модели которого указан как:

@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 к правильному типу устранило проблему.

Источник: Использование Html.RenderPartial() в файлах ascx

Другие советы

Вместо того, чтобы лить модуль в рендерепартирном вызове, и поскольку вы используете бритву, вы можете изменить первую строку на своем представлении от

@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> 
   } 
  }`

Работал для меня, я надеюсь, что это тебе тоже поможет !!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top