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


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

@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 файл работает безупречно. Есть мысли?

6 62

6 ответов:

только что нашел ответ, похоже, что представление, в котором я размещал код RenderPartial, имело динамическую модель, и поэтому MVC не мог выбрать правильный метод для использования. Приведение модели в вызове RenderPartial к правильному типу исправило проблему.

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

вместо приведения модели в вызове RenderPartial, и поскольку вы используете razor, вы можете изменить первую строку в своем представлении из

@model dynamic

до

@model YourNamespace.YourModelType

это имеет преимущество работы на каждом @Html.Partial вызов у вас есть в представлении, а также дает вам intellisense для свойств.

также можно назвать

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

есть еще одна причина, по которой это может быть брошено, даже если вы не используете dynamic/ExpandoObject. Если вы делаете цикл, как это:

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

вот способ передать динамический объект в представление (или частичное представление)

добавьте следующий класс в любом месте вашего решения (используйте пространство имен System, поэтому его можно использовать без добавления каких - либо ссылок) -

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

        }
    }

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

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

Ура

у меня была такая же проблема и в моем случае, это то, что я сделал

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

и в частичном виде

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