سؤال

في مشروعي الحالي لدي 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، وهذا يكفي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top