【问题标题】:ASP.NET MVC, set culture after authorizationASP.NET MVC,授权后设置文化
【发布时间】:2013-09-09 14:53:22
【问题描述】:

我们要设置 Thread.CurrentCulture

  • ASP.NET MVC 模型绑定器/验证器运行之前(当然),但是
  • 用户被授权后(因为我们想从 UserSettings 表中加载文化)

我们应该选择什么正确的扩展点?

动作过滤器太晚了,Global.asax 太早了(用户尚未授权)。有人有好主意吗?

【问题讨论】:

  • 你是如何确定用户的?看来您需要在用户身份验证未授权后设置文化

标签: c# asp.net-mvc asp.net-mvc-4 internationalization


【解决方案1】:

Global.asax 太早了

Global.asax 的事件在请求生命周期的各个阶段发生,有些为时过早 (BeginRequest),有些为时已晚 (EndRequest),也许恰好适合您的要求。

也许是PostAuthorizeRequest 的处理程序,或者如果你想在 Session 中存储东西,PostAcquireRequestState 可以吗?

【讨论】:

  • 请允许我添加指向 this answer 的链接,因为它在该主题上有大量记录。
  • 这些 ASP.NET 事件在 ASP.NET MVC 中难道不是不好的做法吗?
  • 我不明白为什么它们会是不好的做法,尽管它们可能很少使用。
  • 在我忘记之前:您必须在 Init() 内注册该事件 - 而不是在 MVC 的 Application_Start() 内注册!
【解决方案2】:

您可以使用AuthorizationFilter 并扩展内置功能。在授权点,您将能够判断他们是否被授权并相应地执行您的逻辑。

public class CustomAuthAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool isAuthorized = base.AuthorizeCore(httpContext);

        if (isAuthorized)
        {
            // set culture if user is authorized
        }
        else
        {
            // set culture if user is not authorized
        }

        return isAuthorized;
    }
}

【讨论】:

  • 我确实使用通常的 global.asax 恶作剧发布了一些内容,使用自定义 AuthorizationFilter 会更好更干净。
  • “加载用户设置”真的是一项应该在AuthorizationFilter 中完成的任务吗?这不是职责不匹配吗?
  • @SimonRapilly:为什么你认为在 AuthorizationFilter 中实现更简洁?对我来说,Global.PostAuthorizeRequest 听起来更干净?!
  • @D.R.对我来说,“加载用户设置”和授权并不是完全独立的问题,因为它们都处理特定的用户,但我也可以理解授权过滤器可能不是最好的地方。正如 Joe 建议的那样,PostAuthorizeRequest 也可能是放置您的代码的地方,我同意在 MVC 中使用这些事件没有任何问题; MVC 是从 ASP.NET 派生的,因此使用基本功能没有任何问题,就像在对象继承中一样。 MVC 已经使用Application_Start 进行初始化。
  • 谢谢@asymptoticFault,我赞成你的回答,因为我喜欢它,你的论点是可靠的!希望您不介意我已将 Joe 的答案标记为已接受,因为这是我实施的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2011-01-24
  • 1970-01-01
相关资源
最近更新 更多