asp.net мвк. Маршрутизация и построение URL

Кто-нибудь знает, как скрыть некоторые параметры в URL-адресе?

Например, у вас есть параметр URL-адреса «культура». Это может быть «en, fr, it». По умолчанию ваш сайт отображается в культуре «en», и мы не хотим показывать культуру по умолчанию в URL-адресе, но в случаях других культур параметр «культура» должен отображаться в URL-адресе.

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

Это одни и те же страницы в разных культурах. Как это сделать, основываясь на системе маршрутизации asp.net mvc по умолчанию?


person Ilya    schedule 19.04.2013    source источник


Ответы (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

person Cristi Pufu    schedule 19.04.2013
comment
Спасибо за ваш ответ. Как мы можем генерировать URL-адреса для наших страниц, включая текущий язык? Если текущий язык установлен по умолчанию, мы должны использовать один маршрут, а если язык отличается от значения по умолчанию, мы должны использовать другой маршрут. - person Ilya; 19.04.2013
comment
Вы даете общую информацию о маршрутизации и не отвечаете о создании URL-адреса с этой конфигурацией маршрутизации. Но главный вопрос - создание URL! - person Ilya; 20.04.2013
comment
ты пробовал это? Вы должны создать такие URL-адреса, как Html.ActionLink(). Приложение сохранит параметр языкового маршрута - person Cristi Pufu; 22.04.2013

Следующий 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-адреса и отбрасывает маршрут для кандидатуры, когда «культура» в информации о маршруте равна значению по умолчанию.

Я использовал самую простую реализацию, потому что вы не разместили свой код маршрута, но идея должна работать.

надеюсь это поможет.

person shakib    schedule 20.04.2013