TranslateAttribute для моего сайта asp.net-mvc - PullRequest
0 голосов
/ 07 мая 2009

В моем текущем проекте у меня есть пользовательские ViewData, который имеет (среди прочих) следующие свойства:

CustomViewData
  + IList <Language> siteLangauges
  + Language CurrentLanguage
  + T9nProvider

Все мои URL идут так:

http://someUrl.com/{siteLanguage}/{restOfUrlIncludingcontrollersAndACtions}

Я хочу создать ActionAttribute, который перехватывает каждый запрос, проверяет значение siteLanguage и устанавливает значение Language в 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. Почему нет?

Ответы [ 2 ]

0 голосов
/ 07 мая 2009

Вы можете установить 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 );
0 голосов
/ 07 мая 2009

if (viewData - CustomViewData)

Это очень странная проверка. Что это делает?

Я предлагаю тебе бросить.

Вам не нужно вызывать базовую реализацию - base.OnAction ...

Вам также не нужно наследовать от IActionFilter. Достаточно получить из ActionFilterAttribute.

...