如何将请求路由到MVC2中特定控制器中的特定操作?

时间:2011-09-28 11:31:37

标签: c# .net asp.net asp.net-mvc iis

在我的MVC2应用程序中,我有一个继承自AccountController的{​​{1}}类。我想实现以下目标:当用户尝试打开时,应调用Controller Account/Payments/NewPayment方法。

我添加了以下路线:

AccountController.ExecuteNewPayment()

但是当我尝试请求上面的路径时,我收到带有“请求的URL”routes.MapRoute( @"CreateNewRuntime", @"{langId}/Account/Payments/NewPayment/{whatever}", new { langId = @"default", controller = @"Account", action = @"ExecuteNewPayment"}); 的HTTP 404错误消息,当我在调试器下执行此操作时会出现异常

  

System.Web.Mvc.dll中出现'System.Web.HttpException'类型的第一次机会异常   附加信息:未找到路径'/ Account / Payments / NewPayment'的控制器或未实现IController。

我做错了什么?如何执行映射?

4 个答案:

答案 0 :(得分:2)

我相信你应该使用这些路线,

routes.MapRoute(
                @"CreateNewRuntime1",
                @"Account/Payments/NewPayment/{whatever}",
                new { langId="en-US",controller = @"Account", action = @"ExecuteNewPayment" });

        routes.MapRoute(
                @"CreateNewRuntime2",
                @"{langId}/Account/Payments/NewPayment/{whatever}",
            new { controller = @"Account", action = @"ExecuteNewPayment" },
            new { langId = "[a-z]{2}-[a-z]{2}" });

请注意,在第一个路径中,我没有使用langId并将langId默认值设置为“en-US”。在第二条路线中,lan​​gId是必要的,但是正则表达式是存在的,因此页面的其他路线不会受到干扰。没有这个正则表达式,langid可以是其他任何东西。

答案 1 :(得分:1)

您需要将langid作为路径的一部分包含在内,否则即使您指定了默认值,MVC也不会将您的URI映射到它。

采取以下两条路线:

routes.MapRoute(
    @"CreateNewRuntime",
    @"{langId}/Account/Payments/NewPayment/{whatever}",
    new { langId = @"default", controller = @"Account", action = @"ExecuteNewPayment"});


routes.MapRoute(
    @"CreateNewRuntime1",
    @"{langId}/{subLangId}/Account/Payments/NewPayment/{whatever}",
    new { langId = @"default", subLangId= @"test", controller = @"Account", action = @"ExecuteNewPayment1"});

如果我指定/Account/Payments/NewPayment的URI,它应选择哪条路线?如果MVC确实使用langId的默认值,那么第一条路径将始终被使用,因为它是在另一条路由之前声明的。如果您交换了两个,那么第二个将始终被调用。

如果URI的开头有不同的数据,则需要指定它们,并且在指定路径时不能使用默认值。要使这两条路线都被点击,您需要一个/eng/Account/Payments/NewPayment/eng/e/Account/Payments/NewPayment

的URI

答案 2 :(得分:0)

{language}没有对应的默认值,langid应该是language = @"default"吗?

答案 3 :(得分:0)

您需要的是自定义路由处理程序 看看this

问候。