TranslateAttribute لموقعي-asp.net بعثة التحقق المشتركة
-
08-07-2019 - |
سؤال
في مشروعي الحالي لدي ViewData مخصص يحتوي (وغيرهم) الخصائص التالية:
CustomViewData + IList <Language> siteLangauges + Language CurrentLanguage + T9nProvider
جميع الذهاب بلدي URL في مثل هذا:
http://someUrl.com/ {siteLanguage} / {restOfUrlIncludingcontrollersAndACtions}
وأريد أن خلق ActionAttribute التي يمسك كل طلب، يتحقق ما هي القيمة siteLanguage وتحدد قيمة اللغة على CustomViewData. القانون الحالي الخاص بي (غير العاملة) هو من هذا القبيل:
public class TranslateAttribute: ActionFilterAttribute, IActionFilter
{
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
ViewDataDictionary viewData = filterContext.Controller.ViewData;
if (viewData is CustomViewData) {
(viewData as CustomViewData).Language = new Language(filterContext.ActionParameters["siteLanguage"] as string));
}
base.OnActionExecuting(filterContext);
}
void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}
}
والمشكلة الأولى هي أن viewdata أبدا هو customviewdata. لماذا لا؟
المحلول
ويمكنك تعيين ViewData على وحدة تحكم فلماذا لا مجرد تقديم المنشئ للCustomViewData التي تأخذ كائن ViewData والقيام به:
var customData = new CustomViewData( filterContext.Controller.ViewData);
customData.Language = new Language(filterContext.ActionParameters["siteLanguage"] as string));
filterContext.Controller.ViewData = customData;
base.OnActionExecuting( filterContext );
نصائح أخرى
وإذا (viewData هو CustomViewData)
اقتباس فقرة>وهذا هو الاختيار غريب جدا. ماذا يفعل؟
وأقترح عليك أن تسقطها.
وأنت لا تحتاج إلى استدعاء تنفيذ قاعدة - base.OnAction ...
وأنت أيضا لا تحتاج لاشتقاق من IActionFilter. تستمد من ActionFilterAttribute، وهذا يكفي.