2

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

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

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

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

4

2 回答 2

2

这将有助于:

ASP.NET mvc、本地化路由和用户的默认语言

asp.net mvc 本地化

在 ASP.Net MVC 应用程序中设置文化

您必须注册两条路线:

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 }
        );

创建一个Attribute继承ActionFilterAttribute

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

于 2013-04-19T15:20:56.250 回答
0

以下 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,并在路由信息中的“文化”等于默认值时丢弃候选路由。

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

希望这可以帮助。

于 2013-04-20T21:43:22.203 回答