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は使用する正しい方法を選択できなかったようです。正しいタイプのレンダリングパルティアルコールでモデルをキャストすることは、問題を修正しました。

ソース: ASCXファイルでhtml.renderPartial()を使用します

他のヒント

RenderPartial Callでモデルをキャストする代わりに、およびRazorを使用しているので、からの最初の行を変更できます。

@model dynamic

@model YourNamespace.YourModelType

これには、すべてに取り組むという利点があります @Html.Partial ビューに電話して、プロパティのIntellisenseも提供します。

asと呼ぶこともできます

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

Dynamic/ExpandOObjectを使用していなくても、これを投げることができるもう1つの理由があります。このようなループをしている場合:

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

その場合、rootfolderがタイプ「フォルダーである」という事実にもかかわらず、タイプ宣言の代わりに「var」は同じエラーをスローします。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