gpt4 book ai didi

c# - ASP.NET MVC 路由,当我删除文化(语言)时出现 404

转载 作者:行者123 更新时间:2023-11-30 14:56:09 24 4
gpt4 key购买 nike

我的问题:当我使用如下链接时一切正常:

http://localhost:12816/en/Statistic/Reports

但是当我删除“/en”时 - 我收到应用程序错误:

“‘/’应用程序中的服务器错误。找不到资源。”

我有几个不同语言的资源文件。当用户请求没有任何语言标识的链接时,我希望我的应用程序使用默认语言(英语)。

例如我希望这些链接完全相同:

http://localhost:12816/Statistic/Reports
http://localhost:12816/en/Statistic/Reports

顺便说一句,我注意到当我请求没有语言的短链接时 - 一切正常:

http://localhost:12816/Statistic/

但是当链接更深时,我得到错误

我认为问题出在路由上,但我是路由的新手,所以请帮助我:)

PS:我试过这样,但是没用:

routes.MapRoute("Default", "{lang}/{controller}/{action}/{id}",                 
new{
lang = "en",
controller = "Home",
action = "Index",
id = UrlParameter.Optional,
});

routes.MapRoute("Default no language", "{controller}/{action}/{id}",
new
{
controller = "Home",
action = "Index",
id = UrlParameter.Optional
});

最佳答案

您可以尝试从无语言路由中删除默认的“lang”值,并向语言路由添加一个正则表达式常量(例如,允许像“en”或“en-US”这样的文化名称,检查this question关于区域性名称的正则表达式):

routes.MapRoute(
name: "Default lang",
url: "{lang}/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints: new { lang = @"[a-z]{2,3}(?:-[A-Z]{2,3})?" }
);

routes.MapRoute(
name: "Default no language",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

如果您不为 lang 参数添加约束,像 /Statistics/Reports 这样的 url 将始终匹配带有错误参数的语言路由(因为它首先定义)lang =统计,controller=Report,action=Index

因此使用此路由配置,您将获得以下结果:

  • / -> 路由到 Home/Index,没有 lang 的路由值
  • /Home -> 路由到 Home/Index,没有 lang 的路由值
  • /Home/About -> 路由到 Home/About,没有 lang 的路由值
  • /en -> 路由到Home/Index,有一个路由值为lang=en
  • /en/Home -> 路由到Home/Index,有一个路由值为lang=en
  • /en/Home/About -> 路由到Home/About,有一个路由值为lang=en

然后您可以在获取资源所涉及的任何逻辑上使用 lang 路由值,当路由数据中缺少该值时,您可以将其视为默认语言。

例如,假设您创建了一个全局过滤器,它将根据此路由参数在线程上设置 CurrentCulture 和 CurrentUICulture。当没有提供 lang 时,您可以保留它们的默认值(在您的服务器或 web.config 上配置的值),否则根据 lang 参数覆盖它们:

public class InitializeCultureAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.RouteData.Values.ContainsKey("lang")) return;

var culture = filterContext.RouteData.Values["lang"] as string;
if (String.IsNullOrEmpty(culture)) return;

var cultureInfo = CultureInfo.GetCultureInfo(culture);
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
}
}

附言。我并不是说你应该使用这个属性,我只是想展示一个例子,说明你如何处理路由数据中没有 lang 值的情况。因此,对于上面的路由,您应该能够通过查看路由数据中的 lang 参数来调整处理资源的逻辑(尽管我猜您可能希望在这种情况下设置 CurrentUICulture!)

希望这对您有所帮助!

关于c# - ASP.NET MVC 路由,当我删除文化(语言)时出现 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23538361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com