ASP.NET MVC:如何获取路由值

4

我需要获取语言参数的值,我尝试了以下代码:

if(HttpContext.Current.Request.RequestContext.RouteData.Values["language"] == null)
 {
    HttpContext.Current.Request.RequestContext.RouteData.Values["language"] =   "en-US";

}

上面的代码将URL变成以下形式,非常好: http://localhost:25576/en-US/Home 问题是,当用户输入http://localhost:25576/Home(没有en-US)时,HttpContext.Current.Request.RequestContext.RouteData.Values["language"]的值变成了"Home"。
我的问题是,如果用户删除了en-US或输入http://localhost:25576/Home,如何获取语言参数的真实值?
  public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

              }
                  );
         }
2个回答

3
你可以创建一个新的ActionFilterAttribute来实现这个目的:
public class LocalizationAttribute : ActionFilterAttribute
{
    private readonly string _defaultLanguage = "en-US";

    public LocalizationAttribute(string defaultLanguage = null)
    {
        this._defaultLanguage = defaultLanguage ?? this._defaultLanguage;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var language = filterContext.RouteData.Values["language"] as string ?? this._defaultLanguage;

        if (language != this._defaultLanguage)
        {
            try
            {
                Thread.CurrentThread.CurrentCulture =
                    Thread.CurrentThread.CurrentUICulture =
                        CultureInfo.CreateSpecificCulture(language);
            }
            catch
            {
                throw new NotSupportedException($"Invalid language code '{language}'.");
            }
        }
    }
}

您还需要将ActionFilter注册为GlobalFilter的一部分。
public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new LocalizationAttribute("en-US"), 0);
    }
}

谢谢你的帮助和努力 :)我尝试了你的代码,但是当我输入 http://localhost:25576/Home/Contact 而不是 http://localhost:25576/en-US/Home/Contact 时,仍然会出现“找不到资源”的消息。 - Alex
@Alex 你尝试过创建一个 LocalizationAttribute 吗?此外,你的本地化路由应该在默认路由之后注册。 - msmolcic
是的,我已经尝试过了,但仍然面临着同样的问题。 - Alex

0

如果用户请求中忽略了“语言”的令牌,那么在您的代码中“语言”的值可能为“null”或“empty”。因此,您必须将其分配为默认值,例如“en-US”。

以此为例:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
              name: "DefaultLocalized",
              url: "{language}/{controller}/{action}/{id}",
              defaults: new
              {
                  controller = "Home",
                  action = "Index",
                  id = UrlParameter.Optional,
                  language = "en-US"

              }
                  );
         }

请移除您之前向我们展示的语言分配代码片段,这可以完全通过默认路由配置来完成。


谢谢你的帮助和努力 :)我尝试了你的代码,但是当我输入http://localhost:25576/Home/Contact而不是http://localhost:25576/en-US/Home/Contact时,仍然会得到“找不到资源”的消息。 - Alex
NightOwl888,你能帮我吗? - Alex
1
@Alex - 重复的问题确实提供了答案,但它被埋在其他用户做错的东西中,而你没有。向下滚动到标题为默认文化的部分即可查看如何操作。您只需要一个第二个默认路由不带URL中的language参数(但其余URL相同),将language路由值设置为您的默认语言。如果您希望生成不带URL中的区域设置的默认文化,则还需要使用约束条件。 - NightOwl888

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接