0

在我当前的项目中,我有一个自定义 ViewData,它具有(除其他外)以下属性:

自定义视图数据
  + IList <语言> siteLangauges
  + 语言 CurrentLanguage
  + T9nProvider

我所有的网址都是这样的:

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

我想创建一个捕获每个请求的 ActionAttribute,检查 siteLanguage 值是什么,并在 CustomViewData 上设置 Language 值。我当前的(非工作)代码是这样的:

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。为什么不?

4

2 回答 2

0

如果(viewData 是 CustomViewData)

这是一个非常奇怪的检查。它有什么作用?

我建议你放弃它。

您不需要调用基本实现 - base.OnAction ...

您也不需要从 IActionFilter 派生。派生自ActionFilterAttribute,这就够了。

于 2009-05-07T15:38:22.787 回答
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 );
于 2009-05-07T15:41:48.643 回答