2014-01-29 6 views
0

Хорошо, это меня заводит. Мой клиент находится на MVC 2 (да, я знаю) и хочет еще несколько действий, добавленных в их существующее приложение.MVC Route, запрашивающий параметр, когда он указан в моем URL-адресе

Если я кладу в URL из:

http://10.211.55.3/Templates/ 

он работает, как ожидалось, и приходит с действием по умолчанию. Однако, если я ставлю в:

http://10.211.55.3/Templates/GetTemplateDetails/1 

Я получаю эту ошибку:

The parameters dictionary contains a null entry for parameter 'TemplateID' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult GetTemplateDetails(Int32)'. To make a parameter optional its type should be either a reference type or a Nullable type. Parameter name: parameters

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

routes.AddCombresRoute("Combres Route"); 
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
routes.IgnoreRoute("favicon.ico"); 
routes.MapRoute(
    "Default", // Route name 
    {controller}/{action}/{id}", // URL with parameters 
    new {controller = "Home", action = "Index", id = 0} // Parameter defaults 
); 
routes.MapRoute(
    "MarketingRoute", 
    "Marketing/{action}/{routingAction}/{token}", 
    new 
    { 
     controller = "Marketing", 
     action = "Route", 
     routingAction = string.Empty, 
     token = string.Empty 
    }); 

..И вот тестовое воздействие на контроллер, который не работает ....

public ActionResult Index() 
{ 
    return View(); 
} 

[AcceptVerbs(HttpVerbs.Get)] 
[ActionName("GetTemplateDetails")] 
public ActionResult GetTemplateDetails(int TemplateID) 
{ 
    return View(); 
} 

Действительно надеясь свежий пара глаз может помочь понять, что я, очевидно, здесь не замечаю.

ответ

1

Первый Обходной путь является пометка аргумент как необязательного Марк TemplateID в обнуляемого

public ActionResult GetTemplateDetails(int? TemplateID) 
    { 

     return View(); 
    } 

Второй путь

public ActionResult GetTemplateDetails([Bind(Prefix="id")] int TemplateID) 
     { 

      return View(); 
     } 
+0

Это определенно сделает его необязательным, но я думаю, что я обнаружил, что я делаю, и мне нужно разъяснить маршрут маршрутизации MVC. Если я переименую его в GetTemplateDetails (int id), он будет работать. Поэтому я предполагаю, что это связано с тем, что маршрут по умолчанию ищет параметр «id» и «TemplateID». Верный? –

+0

Итак, у вас есть параметр с именем TemplateID, и вы хотите, чтобы у него было значение из идентификатора параметра. Это проблема привязки. Проверьте это для получения дополнительных сведений http://mgolchin.net/posts/20/dive-deep-into-mvc-imodelbinder-part-1 –

0

Параметр на вашем методе контроллера должен быть назван идентификатор. ModelBinder ищет параметр с именем TemplateID, но поскольку параметр по умолчанию (тот, что в URL-адресе) имеет имя id, он никогда не находит его.

Просто измените его следующим образом:

public ActionResult GetTemplateDetails(int id) 
{ 
    return View(); 
} 
0

При определении маршрута как

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

и пытается получить доступ к какому-либо методу с не нулевым параметром, как int TemplateID , то вы должны пройти значение для параметра, такого как http://10.211.55.3/Templates/GetTemplateDetails/?TemplateID=1 , но если ваш параметр имеет имя id, тогда параметр сопоставления автоматически предоставляет значение для параметра, и вы не получаете y ошибка.