如何解决MVC 4应用程序中的CultureNotFoundException?

时间:2017-08-08 11:53:29

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

我在MVC 4应用程序中有这个过滤器:

using System.Globalization;
using System.Threading;
using System.Web.Mvc;
using System;

namespace MvcApplication20.Filters
{
    public class CultureFilter : IAuthorizationFilter
    {
        private readonly string defaultCulture;

        public CultureFilter(string defaultCulture)
        {
            this.defaultCulture = defaultCulture;
        }

        public void OnAuthorization(AuthorizationContext filterContext)
        {
            try
            {
                var values = filterContext.RouteData.Values;

                string culture = (string)values["culture"] ?? this.defaultCulture;

                CultureInfo ci = new CultureInfo(culture);

                Thread.CurrentThread.CurrentCulture = ci;
                Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(ci.Name);
            }
            catch (Exception e)
            {
                Utility.Utility.WriteLineToConsole("Exception: " + e.Message);
            }
        }
    }
}

我正在使用路由来覆盖我的应用程序的本地化,所以我需要在URL中包含语言部分,例如:

http://localhost:5556/en/ControllerName/ControllerMethod

问题是,如果我不小心删除了URL中的语言部分,即文化,我在浏览器中得到" Not Found" 页面,在调试中我得到 CultureNotFoundException ,带有消息:"不支持文化。" 。 当然它无法处理 ControllerName 作为文化/语言。

仍然," Not Found" 页面并没有告诉您问题出现在哪里。

通知我或用户我或他错过了网址中的语言部分的最佳方法是什么?

CultureInfo 类是否有一些处理未知文化的特定方式?

1 个答案:

答案 0 :(得分:1)

您可以通过传递错误代码重定向到某个控制器/操作方法,然后在错误视图中检查该错误代码并将错误显示为“未找到文化”。

在你的catch区块中你可以像

一样写
context.Result = RedirectToRoute("StatusCodeRoute", new { statusCode = "1001" });

然后在StatusCode控制器

[Route("/StatusCode/{statusCode}", Name = "StatusCodeRoute")]
        public IActionResult Index(int statusCode)
        {
           return View(statusCode);

        }

和您的错误视图

@model int

    @{

        var statusCode = Model;

        var statusmessage = "";

        switch (statusCode)

        {

            case "1001":

                statusmessage = "Culture not found";

                break;


            default:

                statusmessage = "That’s odd... Something we didn't expect happened";

                break;

        }

    }

    <div class="jumbotron">

        <h1>Error @Model</h1>

        <h3>@statusmessage</h3>

    </div>