2017-02-22 37 views
0

Я имел приложение ASP.Net MVC с правилами конфигурации маршрутизации, включая этот один:asp.net MVC конфигурации маршрутизации

routes.MapRoute(
     "rule1", 
    "{controller}/{action}/{cid}/{language}/{itemID}/{uid}", 
    new { controller = "Home", action = "action1" } 
    , new[] { "MVCApp.Controllers" } 
); 

Я просто добавил новое действие с тем же количеством параметров и моей конфигурации маршрутизации изменились, как это (rule2 добавлено):

routes.MapRoute(
     "rule2", 
    "{controller}/{action}/{cid}/{language}/{phoneNumber}/{uid}", 
    new { controller = "Home", action = "action2" } 
    , new[] { "MVCApp.Controllers" } 
); 
routes.MapRoute(
     "rule1", 
    "{controller}/{action}/{cid}/{language}/{itemID}/{uid}", 
    new { controller = "Home", action = "action1" } 
    , new[] { "MVCApp.Controllers" } 
); 

Теперь, когда я звоню http://localhost:51650/Home/action2/1/en/1/1 это не путь к action1 и бросает исключение The parameters dictionary contains a null entry for parameter 'itemID' of non-nullable type 'System.Int64' for method 'System.Web.Mvc.JsonResult action1(System.String, Int32, Int64, Int64).

+0

Инверсия порядка. Порядок добавления маршрутов влияет на работу маршрутов. добавьте первое правило1, а затем rule2 – NicoRiff

+0

@NicoRiff Я только что обновил детали исключения. Есть ли способ, которым информация не маршрутизируется на правило2, а маршрутизация пропускает ее и принимает правило1 в действии (для URL-адреса http: // localhost: 51650/Home/action2/1/en/1/1')? – VSB

ответ

2

Вы должны сначала поставить свое правило 1, а затем объявление вашего правила2. Порядок, в котором объявляются маршруты, важен для api, и как только запрос будет соответствовать маршруту, api перестанет искать маршруты и перейдет к указанному контроллеру.

Это из Pro ASP.NET Web API книги:

В зависимости от ваших потребностей, вы можете иметь несколько Web API маршрутов в приложении. Это вполне приемлемый вариант в ASP.NET Web API, но есть несколько важных вещей, о которых нужно знать. Если у вас есть несколько маршрутов, имеет значение порядок регистрации маршрутов . Когда запрос доходит до уровня маршрутизации, сканируется коллекция , чтобы найти совпадение. Как только будет найдена совпадение, поиск останавливается, а остальные маршруты игнорируются. Первый зарегистрированный маршрут будет рассмотрен первым и так далее.

Так как ваши два маршрута имеют одинаковое количество параметров, он выходит на первый маршрут, соответствующий количеству параметров запроса. Чтобы решить эту проблему, вы можете добавить ограничения для своих маршрутов, чтобы вы могли обеспечить, какое значение будет передаваться на каком маршруте, или указать код маршрута в action1 в правиле1 и action2 на правило2 как @Pavel, как указано.

Для жестко прописывать действия по маршруту Правиле1 всегда ДЕЙСТВИЙ1 и Rule2 всегда actoin2, используйте: {controller}/action1/{cid}/{language}/{itemID}/{uid} для действий1 и сделать то же самое для действий2 и Rule2

+0

Как я могу сделать hardcode действие в rule2 или rule1? Поскольку изменение порядка приведет к той же ошибке для другого действия. – VSB

+0

, когда кто-то вводит action1, должен перейти в правило1 и action2 в rule2? – NicoRiff

+0

Я должен отметить, что 'phoneNumber' является' string', а 'itemId' является' int', и когда я изменяю порядок правил, 'phoneNumber' будет null, когда информация направляется на action2. – VSB