Частичное представление с динамической моделью в Razor View Engine и ASP.NET MVC 3 - PullRequest
62 голосов
/ 29 октября 2010

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

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

Ответы [ 7 ]

54 голосов
/ 29 октября 2010

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

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

26 голосов
/ 18 марта 2011

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

@model dynamic

до

@model YourNamespace.YourModelType

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

17 голосов
/ 10 декабря 2010

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

@Html.Partial("_PartialView", (ModelClass)View.Data)
7 голосов
/ 01 августа 2013

Есть еще одна причина, по которой это можно сделать, даже если вы не используете 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)
}
3 голосов
/ 01 апреля 2012

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

Добавьте следующий класс в любое место вашего решения (используйте пространство имен 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());

Cheers

0 голосов
/ 08 мая 2019

Я играл с кодом 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> 
   } 
  }`

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

0 голосов
/ 15 апреля 2016

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

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

и в частичном представлении

@foreach (Shop cabinet in Model)
{
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...