【问题标题】:TranslateAttribute for my asp.net-mvc site我的 asp.net-mvc 站点的 TranslateAttribute
【发布时间】:2009-05-07 15:33:38
【问题描述】:

在我当前的项目中,我有一个自定义 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。为什么不呢?

【问题讨论】:

    标签: c# .net asp.net-mvc action-filter


    【解决方案1】:

    您可以在控制器上设置 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 );
    

    【讨论】:

    • 因为这意味着使用 translate 属性将返回自定义视图数据。
    • 大概,您的 CustomViewData 派生自 ViewDataDictionary。如果没有,它应该。在这种情况下,使用 TranslatedAtttribute 时返回 CustomViewData 对象不会有问题。其他需要 ViewDataDictionary 的对象可以互换使用它。
    • 这个问题是由社区用户挖出来的,从那时起,一堆需求发生了变化。但是对于最初提出的问题,这是我基于我的解决方案的答案。谢谢
    【解决方案2】:

    如果(viewData 是 CustomViewData)

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

    我建议你放弃它。

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

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

    【讨论】:

    • 我的 CustomViewData 有一些保存语言等的属性。如果由于某种原因 translate 属性与另一种类型的视图数据一起使用,我不能使用这些属性。
    • 我为什么不能打电话给基地?如果我的基地中还有其他一些需要调用的操作怎么办?
    • 如果没有怎么办?我删除了这个碱基调用,一切仍然有效。我怀疑基本实现中有什么东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多