عرض عرض جزئي مع النموذج الديناميكي في محرك Razor View و 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

نصائح أخرى

بدلاً من إلقاء النموذج في مكالمة Renderpartial ، وبما أنك تستخدم Razor ، يمكنك تعديل السطر الأول في عرضك من

@model dynamic

ل

@model YourNamespace.YourModelType

هذا له ميزة العمل على كل @Html.Partial اتصل بك في العرض ، ويمنحك أيضًا Intellisense للممتلكات.

يمكن أن يطلق عليها أيضًا

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

هناك سبب آخر يمكن إلقاؤه ، حتى لو كنت لا تستخدم Dynamic/ExployObject. إذا كنت تفعل حلقة ، مثل هذا:

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

        }
    }

عندما ترسل النموذج إلى العرض ، قم بتحويله إلى Exployo:

    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