mvc参数字典包含空条目.....路由错误/问题

时间:2011-07-12 18:54:15

标签: asp.net-mvc routing asp.net-mvc-routing global-asax

所以我有一个名为Cars的控制器,它有:

namespace MySite.Controllers
{
    public class CarsController : ApplicationController
    {

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

        public ActionResult New()
        {
            return View();
        }
        [httppost]
        public ActionResult New()
        {
            return View();
        }


        public ActionResult Details(int id)
        {
            return View();
        }
    }
}

全球性的asax

       routes.MapRouteLowerCase(
            "Cars", // Route name
            "Cars/{id}", // URL with parameters
            new { controller = "Cars", action = "Details", id = URLParameter.Optional}
        );

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

以下是我得到的错误:

  

参数字典包含非参数的空条目   

中方法的可空类型

注意:它让我重定向到“详细信息”视图,并且即使我想要转到“新”视图,也要求输入int。我不确定发生了什么事?我基本上想要将我的网址降低,同时删除启动器路由上的网址上的“操作”...这有意义吗? Anyhelp非常感谢!感谢!!!

2 个答案:

答案 0 :(得分:3)

  

以下所有代码均适用于第一个路线定义   第二条路线定义应保持不变。

您的路由无效

看一下第一个路线定义:

routes.MapRouteLowerCase(
    "Cars", // Route name
    "Cars/{id}", // URL with parameters
    new { controller = "Cars", action = "Details", id = URLParameter.Optional}
);

当您访问Cars/New时,第一条路线会被点击,因为所有参数都可以轻松应用为:

  • controller = "Cars"
  • action = "Details"
  • id = "New"

如果您希望第一个路线定义仅涵盖某些ID,则应对其进行约束或更改路线。数字ID的约束应如下所示:

routes.MapRouteLowerCase(
    "Cars", // Route name
    "Cars/{id}", // URL with parameters
    new { controller = "Cars", action = "Details" },
    new { id = @"\d+" }
);

当您访问Cars/New时,第一条路线不会被命中,因为New不满足ID约束,因此路线处理将继续下一条路线(这将很好地解决它 - 如应该)。

请注意,id不再是可选的。如果对它施加约束,则不能。如果你有一个Details控制器动作,它应该最有可能显示某些细节。所以它实际上需要一些ID。

答案 1 :(得分:0)

如果您的路线设置如下

routes.MapRouteLowerCase(
    "Cars", // Route name
    "Cars/{id}", // URL with parameters
    new { controller = "Cars", action = "Details", id = URLParameter.Optional}
);

这意味着任何以“/ Cars / ...”开头的网址都会将您重定向到详细信息操作,其中包含“/ Cars / New”,它会尝试将“新建”字符串映射到id参数这就是你得到错误的原因。