MVC路由错误:约束条目“长度”

时间:2012-01-18 11:30:31

标签: asp.net-mvc asp.net-mvc-3 c#-4.0 routes

我有一个名为Account的控制器,其操作具有以下签名:

public ActionResult Verify(string userName, Guid authorisationToken);

我创建了一个调用此操作的链接:

/Account/Verify/sachin13/409bdaaa-0b65-4bb8-8695-6e430323d8f8

当我转到此链接时,我收到以下错误:

The constraint entry 'Length' on the route with URL 'Account/{Verify}/{userName}/{authorisationToken}' must have a string value or be of a type which implements IRouteConstraint.

这是我的RegisterRoutes方法在Global.asax中的样子:

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

            routes.MapRoute(
                "AccountVerify",
                "Account/{Verify}/{userName}/{authorisationToken}",
                new { controller = "Account", action = "Verify", userName = "", authorisationToken = "" },
                "UI.Controllers"
            );
        }

两个问题:

  1. 我是否做了一些与众不同的事情,或者我的方法是否符合标准惯例?

  2. 这里有什么问题?

  3. 谢谢,

    萨钦

2 个答案:

答案 0 :(得分:13)

你应该改变

"UI.Controllers"

new[] { "UI.Controllers" }

在你的第二条路线。

如果你只指定一个字符串(不是一个数组),那么你会错误地重载MapRoute函数 - 而不是MapRoute(RouteCollection, String, String, Object, String[])接受命名空间列表作为最后一个参数MapRoute(RouteCollection, String, String, Object, Object) public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "AccountVerify", "Account/Verify/{userName}/{authorisationToken}", new { controller = "Account", action = "Verify", userName = "", authorisationToken = "" }, new [] { "UI.Controllers" } ); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } ,// Parameter defaults new[] { "UI.Controllers" } ); } 1}}期望约束作为最后一个参数。字符串“UI.Controllers”不是正确的约束规范=>你得到错误。

同样,@ Pankaj建议您的自定义路线应该在默认路由之前,并且验证应该没有“{}”。

完整代码:

{{1}}

答案 1 :(得分:2)

始终在默认路由之前声明自定义路由,以使其按照从头到尾的顺序工作。因此,您需要在默认路由之前声明第二个路由,它应该解决我想的问题。另外,删除第二条路线中的验证“{}”