2009-05-07 4 views
0

В моем текущем проекте у меня есть собственные ViewData, что имеет (среди прочих) следующие свойства:TranslateAttribute для моего asp.net-MVC сайта

 
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); 
    } 
} 

Первая проблема в том, что видеоданные не является customviewdata. Почему нет?

ответ

0

Вы можете установить 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

Потому что это означает, что использование атрибута translate приведет к возврату пользовательских представлений. –

+0

Предположительно, ваш CustomViewData происходит из ViewDataDictionary. Если нет, то это должно произойти. В этом случае при использовании TranslatedAtttribute не будет проблемой вернуть объект CustomViewData. Другие объекты, ожидающие использования ViewDataDictionary, могут использовать его взаимозаменяемо. – tvanfosson

+0

Этот вопрос был откомандирован пользователем Сообщества, и с тех пор изменился набор требований. Но к первоначально заданному вопросу, это был ответ, на который я основал мое решение. благодаря –

0

если (ViewData является CustomViewData)

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

Предлагаю вам отказаться от него.

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

Вам также не нужно извлекать из IActionFilter. Вывод из ActionFilterAttribute, этого достаточно.

+0

Мои CustomViewData имеет несколько свойств, которые держат языки и т.д. Если для некоторых причина, по которой атрибут translate используется с другим типом представлений, я не могу использовать эти свойства. –

+0

Почему бы мне не назвать базу? Что делать, если в моей базе есть какие-то другие действия, требующие вызова? –

+0

Что делать, если нет? Я удалил базовые вызовы и все еще работает. Я сомневаюсь, что есть что-то в базовой реализации. – User