.NET MVC 3 маршрута - PullRequest
       6

.NET MVC 3 маршрута

1 голос
/ 30 сентября 2011

Недавно я перешел с веб-форм на MVC 3 и пытался освоить маршруты MVC. У меня есть несколько странная проблема в том, что когда я получаю запрос к моему приложению (например, subdomain1.organisation.com или subdomain2.organisation.com), я хочу, чтобы маршрут по умолчанию использовался следующим образом:

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
);

Однако, когда моя заявка получает запрос через определенный поддомен, например, subdomain3.organisation.com, я хочу, чтобы приложение по умолчанию для определенного контроллера. Я был следующий код на:

http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx

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

routes.Add("DomainRoute", new DomainRoute(
    "subdomain3.organisation.com", // Domain with parameters
    "{action}/{id}",    // URL with parameters
    new { controller = "Subdomain3Controller", action = "Index", id = "" }
));

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

При развертывании мое приложение работает правильно, когда запросы отправляются на subdomain3.organisation.com с использованием Subdomain3Controller. Однако при посещении любого другого субдомена, например, localhost / Subdomain3Controller / Index мое приложение, похоже, выбрало неправильный маршрут.

Похоже, что помощники моей формы возвращают неверное значение для:

ViewContext.Controller.ValueProvider.GetValue("controller").AttemptedValue

@using(Html.BeginForm(ViewContext.Controller.ValueProvider.GetValue("action").AttemptedValue, ViewContext.Controller.ValueProvider.GetValue("controller").AttemptedValue, FormMethod.Post, new Dictionary<string, object> {{ "id", "formid" } })){

Есть идеи, почему это может быть? Любой свет, который кто-либо мог бы пролить на этот вопрос, был бы очень признателен.

Большое спасибо заранее.

Ответы [ 3 ]

0 голосов
/ 04 октября 2011

Я также заметил, что, если я жестко закодирую имя контроллера в помощнике BeginForm, все равно будет возвращено неверное значение действия:

      using (Html.BeginForm("Index", "Subdomain3Controller", FormMethod.Post, new Dictionary<string, object> { { "id", "formid" } }))
        {

создает:

<form id="formid" method="post" action="/">

вместо:

 <form id="formid" method="post" action="/Subdomain3Controller">

при просмотре:

http://localhost/Subdomain3Controller/ или http://localhost/Subdomain3Controller/Index

0 голосов
/ 06 марта 2013

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

В любом случае, кажется, что название маршрута "Default" не добавляет веса. Когда BeginForm создает свой URL, он выбирает первый маршрут из коллекции маршрутов, которая «подходит». Я не слишком углубился в то, как все это работает внутри.

Для решения этой проблемы я добавил ограничение на маршрут поддоменов, чтобы его можно было использовать только для Subdomain3Controller, как таковое:

        var domainRoute =  new DomainRoute(
            "subdomain3.organisation.com", // Domain with parameters
            "{action}/{id}",    // URL with parameters
            new { controller = "Subdomain3Controller", action = "Index", id = "" }
        );

        domainRoute.Constraints = new RouteValueDictionary();
        webserviceRoute.Constraints.Add("Controller", "Subdomain3Controller");

        routes.Add("DomainRoute", domainRoute);

[править] Подумав об этом немного больше и осознав, что моя ситуация немного отличается от ситуации с оригинальным постером. Выше не будет работать, потому что контроллер больше не находится внутри URL.

Решением может быть переключение порядка маршрутов и добавление ограничения NotEqual для поддоменов к маршруту по умолчанию. Как описано в http://stephenwalther.com/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints.aspx [/ Править]

0 голосов
/ 30 сентября 2011

Пробовали ли вы отладчик маршрутизации , предназначенный для устранения проблем такого рода

Похоже, теперь его можно установить и через Nuget.

...