Ignia.Topics.Web.Mvc
يوفر تجميع Ignia.Topics.Web.Mvc
تطبيق OnTopic للاستخدام مع ASP.NET MVC 5.x Framework.
هناك ثلاثة مكونات رئيسية في قلب تنفيذ MVC.
MvcTopicRoutingService
: هذا تطبيق ملموس لـ ITopicRoutingService
الذي يقبل المعلومات السياقية حول طلب معين (في هذه الحالة، عنوان URL وبيانات التوجيه) ثم يستخدمها لاسترداد Topic
الحالي من ITopicRepository
.TopicController
: هذا هو مثيل وحدة التحكم الافتراضية التي يمكن استخدامها لأي مسار موضوع. وسوف يتحقق تلقائيًا من وجود Topic
، وأنه غير معطل ( IsDisabled
)، وسيحترم أي عمليات إعادة توجيه (على سبيل المثال، إذا تم ملء سمة Url
). وإلا، فسيتم إرجاع TopicViewResult
استنادًا إلى نموذج العرض واسم العرض ونوع المحتوى.TopicViewEngine
: يتم استدعاء TopicViewEngine
في كل مرة يتم فيها طلب عرض. وهو يعمل جنبًا إلى جنب مع TopicViewResult
لتحديد طرق عرض MVC المطابقة بناءً على المواقع والاتفاقيات المحددة مسبقًا. وتناقش هذه أدناه. هناك ستة وحدات تحكم رئيسية تأتي مع تطبيق MVC. بالإضافة إلى TopicController
الأساسي، يتضمن ذلك وحدات التحكم الإضافية التالية:
ErrorControllerBase<T>
: يوفر الدعم لإجراءات Error
و NotFound
و InternalServer
. يمكن قبول أي IPageTopicViewModel
كوسيطة عامة؛ الذي سيتم استخدامه كنموذج العرض.FallbackController
: يُستخدم في مصنع وحدات التحكم كإجراء احتياطي، في حالة عدم قدرة وحدات التحكم الأخرى على قبول الطلب. ما عليك سوى إرجاع NotFoundResult
برسالة محددة مسبقًا.LayoutControllerBase<T>
: يوفر الدعم لقائمة التنقل عن طريق تعيين المستويات الثلاثة العليا لمساحة الاسم الحالية تلقائيًا (على سبيل المثال، Web
والإصدارات التابعة له والأحفاد). يمكن قبول أي INavigationTopicViewModel
كوسيطة عامة؛ سيتم استخدامه كنموذج عرض لكل مثيل معين.RedirectController
: يوفر إجراء Redirect
واحد يمكن ربطه بمسار مثل /Topic/{ID}/
؛ يوفر هذا الدعم لعناوين URL الدائمة المستقلة عن GetWebPath()
.SitemapController
: يوفر إجراء Sitemap
واحد يقوم بإرجاع مرجع إلى ITopicRepository
، مما يسمح بعرض خريطة الموقع بالتكرار على الرسم البياني للموضوع بأكمله، بما في ذلك جميع السمات.ملاحظة: لا توجد طريقة عملية لـ MVC لتوفير التوجيه لوحدات التحكم العامة. على هذا النحو، يجب أن يتم تصنيفها ضمن فئات فرعية حسب كل تطبيق. لا تحتاج وحدة التحكم المشتقة إلى القيام بأي شيء خارج نطاق توفير مرجع نوع محدد للقاعدة العامة.
افتراضيًا، يطابق OnTopic طرق العرض استنادًا إلى ContentType
الخاص بالموضوع الحالي، وطريقة View
، إذا كانت متوفرة.
هناك طرق متعددة لتعيين طريقة العرض. سيقوم TopicViewResult
بتقييم طرق العرض تلقائيًا بناءً على المواقع التالية. تم تحديد أول اسم يطابق اسم عرض صالح.
?View=
معلمة سلسلة الاستعلام (على سبيل المثال، ?View=Accordion
)Accept
الرؤوس (على سبيل المثال، Accept=application/json
); سيتعامل مع المقطع بعد /
كاسم عرض محتملView
السمة (على سبيل المثال، topic.View
)ContentType
(على سبيل المثال، topic.ContentType
) بالنسبة لكل قاعدة من قواعد مطابقة العرض المذكورة أعلاه، سيبحث TopicViewEngine
في المواقع التالية عن طريقة عرض مطابقة:
~/Views/{ContentType}/{View}.cshtml
~/Views/ContentTypes/{ContentType}.{View}.cshtml
~/Views/ContentTypes/{ContentType}.cshtml
~/Views/Shared/{View}.cshtml
ملاحظة: بعد البحث في كل موقع من هذه المواقع عن كل قاعدة من قواعد مطابقة العرض، سيتم تسليم التحكم إلى
RazorViewEngine
، الذي سيقوم بالبحث في المواقع الافتراضية الجاهزة لـ ASP.NET MVC.
إذا كان topic.ContentType
هو ContentList
وكان رأس Accept
هو application/json
، فسيتم تنسيق TopicViewResult
و TopicViewEngine
للبحث في المسارات التالية:
~/Views/ContentList/JSON.cshtml
~/Views/ContentTypes/ContentList.JSON.cshtml
~/Views/ContentTypes/JSON.cshtml
~/Views/Shared/JSON.cshtml
إذا لم يتم العثور على أي تطابق، فسيتم البحث في رأس Accept
التالي. في النهاية، إذا لم يتم العثور على أي تطابق في قواعد مطابقة العرض المتنوعة، فسيتم البحث فيما يلي:
~/Views/ContentList/ContentList.cshtml
~/Views/ContentTypes/ContentList.ContentList.cshtml
~/Views/ContentTypes/ContentList.cshtml
~/Views/Shared/ContentList.cshtml
في global.asax.cs
، يجب تسجيل المكونات التالية ضمن معالج الأحداث Application_Start
:
ControllerBuilder.Current.SetControllerFactory(new OrganizationNameControllerFactory());
ViewEngines.Engines.Insert(0, new TopicViewEngine());
ملاحظة: اسم مصنع وحدة التحكم عشوائي، ويجب أن يتبع الاصطلاحات المناسبة للموقع. يستخدم Ignia عادةً
{OrganizationName}ControllerFactory
(على سبيل المثال،IgniaControllerFactory
)، لكن OnTopic لا يحتاج إلى معرفة الاسم أو الاهتمام به؛ هذا بين التطبيق الخاص بك وASP.NET MVC Framework.
عند تسجيل المسارات عبر RouteConfig.RegisterRoutes()
(عادةً عبر فئة RouteConfig
)، قم بتسجيل مسار لأي مسارات OnTopic:
routes.MapRoute(
name: "WebTopics",
url: "Web/{*path}",
defaults: new { controller = "Topic", action = "Index", id = UrlParameter.Optional, rootTopic = "Web" }
);
ملاحظة: نظرًا لأن OnTopic يعتمد على أسماء مسارات أحرف البدل، فيجب تكوين مسار جديد لكل مساحة اسم جذر (على سبيل المثال،
/Web
). على الرغم من أنه من الممكن تكوين OnTopic لتقييم جميع المسارات، إلا أن هذا يجعل من الصعب تفويض التحكم إلى وحدات التحكم والمعالجات الأخرى، عند الضرورة.
نظرًا لأن OnTopic يعتمد على حقن المُنشئ، فيجب تكوين التطبيق في جذر التركيب - في حالة ASP.NET MVC، فهذا يعني مصنع وحدة تحكم مخصص. قد يبدو الهيكل الأساسي لهذا كما يلي:
var connectionString = ConfigurationManager.ConnectionStrings["OnTopic"].ConnectionString;
var sqlTopicRepository = new SqlTopicRepository(connectionString);
var cachedTopicRepository = new CachedTopicRepository(sqlTopicRepository);
var topicViewModelLookupService = new TopicViewModelLookupService();
var topicMappingService = new TopicMappingService(cachedTopicRepository, topicViewModelLookupService);
var mvcTopicRoutingService = new MvcTopicRoutingService(
cachedTopicRepository,
requestContext.HttpContext.Request.Url,
requestContext.RouteData
);
switch (controllerType.Name) {
case nameof(TopicController):
return new TopicController(sqlTopicRepository, mvcTopicRoutingService, topicMappingService);
case default:
return base.GetControllerInstance(requestContext, controllerType);
}
للحصول على قالب مرجعي كامل، بما في ذلك وحدات التحكم الإضافية، راجع OrganizationNameControllerFactory.cs
Gist.
ملاحظة: سيقوم
TopicController
الافتراضي بتعريف الموضوع الحالي تلقائيًا (استنادًا إلى عنوان URL على سبيل المثال)، وتعيين الموضوع الحالي إلى نموذج العرض المقابل (استنادًا إلى اصطلاحاتTopicMappingService
)، ثم إرجاع العرض المقابل (استنادًا إلى اصطلاحات العرض). بالنسبة لمعظم التطبيقات، وهذا يكفي. إذا كانت هناك حاجة إلى قواعد تعيين مخصصة أو منطق عرض إضافي، فيمكن للمنفذينTopicController
إلى فئة فرعية.