عرض عرض جزئي مع النموذج الديناميكي في محرك Razor View و ASP.NET MVC 3
-
27-09-2019 - |
سؤال
عندما أحاول تقديم طريقة عرض جزئية تم تحديد نوع النموذج على النحو التالي:
@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 إلى النوع الصحيح الذي تم إصلاحه في المشكلة.
نصائح أخرى
بدلاً من إلقاء النموذج في مكالمة 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>
}
}`
لقد نجحت بالنسبة لي ، وآمل أن يساعدك هذا أيضًا !!