.NET MVC路由可以工作,除了一个

时间:2012-06-02 14:55:40

标签: asp.net-mvc-3 model-view-controller asp.net-mvc-routing

这里没什么帮助和建议。

在我的第一个MVC应用程序上工作,我有一个学生设置实体 具有基本CRUD功能的学生控制器和视图。 mysite.com/Student让我在那里。

现在我想添加付款,所以我添加了一个Payments控制器和基本crud的视图。 这给了我mysite.com/Payments

我希望付款的网址如下:mysite.com/Student/Payments

所以我研究了URL路由,并且(我认为)我已经向后退了很长时间,因为似乎没有任何工作。但是现在,我已经创建了这个额外的路线:

        routes.MapRoute(
            "Payments",
            "Student/Payments/{action}/{id}",
            new { Controller = "Payments", action = "Index", id = UrlParameter.Optional }
            );

现在一切似乎都正常了。当我将ActionLink发送到付款控制器中的任何操作时,URL是正确的。例如:www.mysite.com/Student/Payments/Edit/5作为URL出现。

我遇到的问题是Payments仍然是一个基本的URL路由。所以我也可以访问www.mysite.com/Payments

来获得付款

如何“删除”该路线,以便mysite.com/Payments无效?或者我是以某种方式做到这一切?

任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

你对它的思考是一种扭曲的方式。映射配置只提供一个规则的规则列表,以指定特定URL的代码所在的位置。

所以当你说它还在打mysite.com/Payments时。那是因为它击中了Global.asax中的默认规则

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

你可以删除它,但是没有默认规则可以使用。

或者您可以添加忽略规则。在你的情况下像

        routes.IgnoreRoute("Payments/{action}/{id}");

请确保将其置于默认规则之上。

答案 1 :(得分:0)

您需要使用MapRoute方法的重载作为默认路由,例如:

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

关于创建自定义约束的this blog post,有"不等于"

的示例