Язык в URL, маршрутизации и областях - PullRequest
1 голос
/ 17 марта 2011

До сих пор я узнал, как настроить правильную маршрутизацию, если я хочу, чтобы язык был в URL, например, .../en/MyController/MyMethod.Со следующей маршрутизацией это прекрасно работает до сих пор:

        routes.MapRoute("Default with language", "{lang}/{controller}/{action}/{id}",     
        new
        {
            controller = "Report",
            action = "Index",
            id = UrlParameter.Optional,
        }, new { lang = "de|en" });
        // Standard-Routing
        routes.MapRoute("Default", "{controller}/{action}/{id}", new
        {
            controller = "Report",
            action = "Index",
            id = UrlParameter.Optional,
            lang = "de",
        });

Теперь я вставил новую область Cms, и я вызываю AreaRegistration.RegisterAllAreas(); в Application_Start ().

Как только яПозвоните контроллеру в этой области, мне не хватает языковой клавиши:

        MvcHandler handler = Context.Handler as MvcHandler;
        if (handler == null)
            return;

        string lang = handler.RequestContext.RouteData.Values["lang"] as string;

Как я могу заставить вышеуказанную маршрутизацию работать с областями?

Thx для любых подсказок, sl3dg3

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Проверьте сгенерированный класс, производный от AreaRegistration с именем [AreaName]AreaRegistration.

Он также содержит регистрацию маршрута, это значение по умолчанию:

context.MapRoute(
   "AreaName_default",
   "AreaName/{controller}/{action}/{id}",
    new { action = "Index", id = UrlParameter.Optional }
);
0 голосов
/ 17 марта 2011

В моем случае теперь работает следующая маршрутизация (область называется Cms):

using System.Web.Mvc;

namespace MyProject.Areas.Cms
{
    public class CmsAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Cms";
            }
        }

        public override void RegisterArea(AreaRegistrationContext context)
        {

        context.MapRoute("Cms_default_with_language", "Cms/{lang}/{controller}/{action}/{id}", new
        {
            controller = "Home",
            action = "Index",
            id = UrlParameter.Optional,
            lang = "de",
        }, new { lang = "de|en" });
        context.MapRoute(
            "Cms_default",
            "Cms/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional, lang = "de" }
        );

        }
    }
}

Единственное, чем я не очень доволен: теперь у меня более или менее повторяющийся код в Global.asax и в этом классе. Есть ли способ избежать этих дублированных сопоставлений?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...