Ошибка нулевых параметров маршрутизации MVC при использовании двух картографических маршрутов на одном контроллере - PullRequest
0 голосов
/ 15 января 2019

Я пытался использовать карту маршрута в моем проекте MVC, первый маршрут "route1" работает нормально с двумя параметрами http://localhost:43601/records/index/1/5454546

теперь второй маршрут - на том же контроллере - recordcontroller- НЕ работает "route2" http://localhost:43601/records/attachmentdetails/828/2 и дал ошибку:

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

любая помощь, пожалуйста?

//route code 
routes.LowercaseUrls = true;
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            //Web API
            routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
            routes.MapRoute(
        name: "route1",
        url: "{controller}/{action}/{libId}/{recordNo}",
        defaults: new { controller = "Records", action = "Index", id = UrlParameter.Optional }
    );
            routes.MapRoute(
           name: "route2",
           url: "{controller}/{action}/{attId}/{atype}",
           defaults: new { controller = "Records", action = "AttachmentDetails", id = UrlParameter.Optional }
       );
                routes.MapRoute(
           name: "Default",
           url: "{controller}/{action}/{id}",
           defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
       );
            routes.MapRoute(
           name: "Default4",
           url: "{controller}/{action}/{attId}/{atype}",
           defaults: new { controller = "FileManager", action = "BookAttachmnt", id = UrlParameter.Optional }
       );
//controllers code
public ActionResult Index(string libId, int recordNo = 0)
        {
}
public ActionResult AttachmentDetails(int attId, int atype)
        {
            BasicSearchAttribute();
            return View();
        }

1 Ответ

0 голосов
/ 15 января 2019

Вы соответствуете route1, когда вы действительно хотите соответствовать route2.

Чтобы добиться этого, используйте вместо этого маршрут и поставьте его перед route1.

routes.MapRoute(
       name: "route2",
       url: "Records/{action}/{attId}/{atype}",
       defaults: new { controller = "Records", action = "AttachmentDetails", id = UrlParameter.Optional }
 );

Причина, по которой ваш код не работает, заключается в том, что маршруты соответствуют «сверху вниз» (то есть в порядке, в котором они определены). Используемый вами URL соответствует правилам для route1 до и соответствует правилам для route2. Увы, route1 имеет разные имена параметров (libId, а не attId), и поэтому маршрутизация завершается ошибкой, поскольку вашему действию требуется параметр attId, но ему дали параметр libId.

Но если поставить вышеупомянутый маршрут первым , это будет означать, что он привыкнет, а не route1. Также обратите внимание, что я жестко прописал Records в маршруте, чтобы гарантировать, что URL-адреса, начинающиеся с Records, обрабатываются route2, а , все остальное обрабатывается route1 (или более поздними маршрутами). ).

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