66

モデルタイプが次のように指定されている部分ビューをレンダリングしようとすると:

@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 ファイル内の同じコードは問題なく機能します。何かご意見は?

4

7 に答える 7

55

答えが見つかったところ、RenderPartialコードを配置していたビューに動的モデルが含まれていたため、MVCは使用する正しい方法を選択できなかったようです。RenderPartial呼び出しでモデルを正しいタイプにキャストすると、問題が修正されました。

ソース:ascxファイルでのHtml.RenderPartial()の使用

于 2010-10-28T22:14:24.367 に答える
26

RenderPartial 呼び出しでモデルをキャストする代わりに、かみそりを使用しているため、ビューの最初の行を次のように変更できます。

@model dynamic

@model YourNamespace.YourModelType

これには、ビュー内のすべての呼び出しで作業できるという利点があり@Html.Partial、プロパティのインテリセンスも得られます。

于 2011-03-18T19:43:21.597 に答える
18

としても呼べる

@Html.Partial("_PartialView", (ModelClass)View.Data)
于 2010-12-10T11:42:07.063 に答える
8

dynamic/ExpandoObject を使用していなくても、これがスローされる別の理由があります。次のように、ループを実行している場合:

@foreach (var folder in ViewBag.RootFolder.ChildFolders.ToList())
{
    @Html.Partial("ContentFolderTreeViewItems", folder)
}

その場合、型宣言の代わりに「var」を使用すると、RootFolder の型が「Folder」であるにもかかわらず、同じエラーがスローされます。var を実際の型に変更すると、問題は解決します。

@foreach (ContentFolder folder in ViewBag.RootFolder.ChildFolders.ToList())
{
    @Html.Partial("ContentFolderTreeViewItems", folder)
}
于 2013-08-01T17:52:29.407 に答える
4

動的オブジェクトをビュー (または部分ビュー) に渡す方法は次のとおりです。

ソリューションの任意の場所に次のクラスを追加します (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());

乾杯

于 2012-04-01T04:16:16.897 に答える
2

私は同じ問題を抱えていました。私の場合、これが私がしたことです

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

および部分ビューで

@foreach (Shop cabinet in Model)
{
    //...
}
于 2016-04-15T08:00:15.967 に答える