我在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 类是否有一些处理未知文化的特定方式?
答案 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>