【问题标题】:asp.net mvc. Routing and Url buildingASP.NET MVC。路由和 URL 构建
【发布时间】:2013-04-12 18:54:35
【问题描述】:

有没有人知道如何在 url 中隐藏一些参数?

例如,您有一个 url 参数“culture”。它可以是“en, fr, it”。 默认情况下,您的网站以“en”文化呈现,我们不会在 URL 中显示默认文化,但在其他文化的情况下,参数“culture”必须出现在 URL 中。

http://myrendersite.net/barbikueue
http://myrendersite.net/fr/barbikueue

这是不同文化中的相同页面。 基于默认的asp.net mvc路由系统怎么做?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-routing helpers


    【解决方案1】:

    这会有所帮助:

    ASP.NET mvc, localized routes and the default language for the user

    asp.net mvc localization

    Set Culture in an ASP.Net MVC app

    你必须注册两条路线:

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

    创建一个继承ActionFilterAttributeAttribute

    public class LanguageActionFilterAttribute : ActionFilterAttribute
        {
    
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                var routeDataKey = "language";
                var defaultLang = "en";
                var defaultCulture = "EN";
    
                // if no language route param received
                if (filterContext.RouteData.Values[routeDataKey] == null /* && currentCulture != "en-EN" */)
                {
                    // change culture to en-EN
                    Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", defaultLang, defaultCulture));
                    Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", defaultLang, defaultCulture));
                }
                else
                {
                     /*if (currentCulture != "whatever")
                     { 
                        //set culture to whatever
                     }*/
                }
    
                base.OnActionExecuting(filterContext);
            }
        }
    

    然后使用之前创建的属性创建一个BaseController

    [LanguageActionFilter]
    public abstract class BaseController : Controller
    {
    
    }
    

    你所有的Controllers现在都将继承BaseController,而不是Controller

    【讨论】:

    • 感谢您的回答。我们如何生成包含当前语言的页面的 url?如果当前语言是默认的,那么我们必须使用一个路由,然后语言不是默认的,我们必须使用另一个路由。
    • 您提供了有关路由的一般信息,但没有关于使用此路由配置创建 url 的答案。但主要问题是 url 创建!
    • 你试过了吗?您应该创建像Html.ActionLink() 这样的网址。应用程序将保存语言路由参数
    【解决方案2】:

    以下 RouteConstraint 可能会有所帮助,

    public class CultureConstraint : IRouteConstraint
    {
        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values,
                          RouteDirection routeDirection)
        {
            if (routeDirection == RouteDirection.UrlGeneration)
            {
                return values[parameterName] != null &&
                       (route.Defaults[parameterName] == null ||
                        values[parameterName].ToString().ToLower() != route.Defaults[parameterName].ToString().ToLower());
            }
            return true;
        }
    }
    

    把它当做,

    routes.MapRoute(
        name: "Culture",
        url: "{culture}/{controller}/{action}/{id}",
        defaults: new {culture = "en", controller = "Home", action = "Index", id = UrlParameter.Optional},
        constraints: new {culture = new CultureConstraint()}
    );
    
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional}
    );
    

    这里的约束只适用于出站 url,当路由信息中的“文化”等于默认值时,放弃候选路由。

    我使用了最简单的实现,因为你没有发布你的路由代码,但这个想法应该可行。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 2010-12-24
      • 2010-11-22
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多