ASP.NET MVC Route не работает с ограничением - PullRequest
1 голос
/ 12 февраля 2010

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

У меня есть действие контроллера следующим образом:

    [RequiresRole(RoleToCheckFor = "Administrator"), AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Edit(int id)
    {
       ...
    }

и следующие маршруты в Global.asax.cs:

        routes.MapRoute(
            "UserEdit",       
            "user/edit/{id}",       
            new {controller = "user", action = "edit"},   
            new {id = @"\d+"}
            );

        routes.MapRoute(
            "Default",                                              
            "{controller}/{action}/{id}",                           
            new { controller = "Home", action = "Index", id = "" }  
            );

        routes.MapRoute("Error",
                "{*url}",
                new { controller = "Error", action = "notfound" });

Поэтому я ожидаю, что если я введу http://domain.com/user/edit/ABCD i , то не должен получить следующую обычную ошибку:

Словарь параметров содержит пустую запись для параметра 'id' ненулевого типа 'System.Int32' для метода 'System.Web.Mvc.ActionResult Edit (Int32)'

Это (я думаю) это именно то, что также сказано в http://www.asp.net/%28S%28pdfrohu0ajmwt445fanvj2r3%29%29/learn/mvc/tutorial-24-cs.aspx

Тем не менее, я все еще вижу ошибку "... null entry ...".

Есть идеи, почему это так? Что-то не так с настройкой маршрута?

Спасибо

Ответы [ 3 ]

3 голосов
/ 12 февраля 2010

ваш второй маршрут

routes.MapRoute(
        "Default",                                              
        "{controller}/{action}/{id}",                           
        new { controller = "Home", action = "Index", id = "" }  
        );

ловит его и не стесняется.

Используйте Отладчик маршрута Phil Haacks для таких проблем

1 голос
/ 27 февраля 2010

Как указывает Пол, маршрут правильно пропускается, потому что ограничение не совпадает. Таким образом, система маршрутизации переходит к следующему маршруту и ​​пытается сопоставить его. Поскольку второй маршрут не ограничен, он будет совпадать и обрабатываться.

Есть несколько способов обойти это.

Один из самых простых способов - удалить ограничение из маршрута и выполнить проверку параметров в действии контроллера.

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

    routes.MapRoute(
        "UserEditError",
        "user/edit/{id}",
        new {controller = "user", action = "EditError"}
        ); 

Обратите внимание, что этот маршрут имеет ограничение no и переходит к действию EditError. Таким образом, вы могли бы предоставлять больше ошибок для людей, которые вводят недействительные URL.

0 голосов
/ 07 октября 2015

ошибка, которую мне всегда удается сделать это положить

controller = "HomeController" вместо controller = "Home". Это будет нарушать ваши маршруты каждый раз: -)

  context.MapRoute(
     name: "RedirectAll",
     url: "{*url}",
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
     namespaces: new[] { typeof(HomeController).Namespace },
                  constraints: new { host = new HostConstraint("defenderrazor.com") });
...