使用MVC路由缩短URL参数

时间:2009-08-15 13:45:58

标签: asp.net-mvc url-routing asp.net-mvc-routing

我有一个网址:

  

example.com/profile/publicview?profileKey=5

我希望通过路由

将其缩短
  

example.com/profile/5

我该怎么做?

这是我的尝试:

routes.MapRoute(
    "Profile", "Profile/{profileKey}", 
    new { controller = "Profile", action = "PublicView", profileKey ="" }
);

但是他产生了这个错误:

  

参数字典包含一个   参数'profileKey'的空条目   非可空类型'System.Int32'   方法   “System.Web.Mvc.ActionResult   PublicView(Int32)'中   “Website.Controllers.ProfileController

行动方法

public ActionResult PublicView(int profileKey)
  {
        //stuff
  }

4 个答案:

答案 0 :(得分:2)

在控制器上更改PublicView(int?profileKey)

回答评论

是的,但由于路由中的默认值为null,因此您需要处理它。否则,请更改路线中的默认值。

<强> MAYBE

这可能无济于事,但值得一试。这是我的网站代码:

        routes.MapRoute(
            "freebies",                                              // Route name
            "freebies/{page}",                           // URL with parameters
            new { controller = "Home", action = "Freebies", page = 1 }  // Parameter defaults
        );

链接:

http://localhost/freebies/2

这很好用。

答案 1 :(得分:1)

您的路线和操作方法是正常的,当且仅当您在网址中包含整数值时,如 example.com/profile/ 5 。 (我假设这条路线在默认路线上方定义)

你定义的是一个路由,如果url中没有提供profileKey,则将其默认为空字符串,并且在你的action方法中你试图将这个值绑定到一个不可为空的整数,所以如果你正在尝试 example.com/profile example.com/profile/not-an-int 这将抛出您报告的异常。您的路由将为profileKey分配一个空字符串,但您的操作方法无法将其转换为整数。作为Martin pointed out,解决这个问题的方法是使用可空的int代替。另一种解决方案是将路由中的此值默认为整数。

如果您仍然收到错误,请确保您要求的实际网址正确并且包含了profileKey。我知道有时候使用默认的html和/或url帮助器时我会错误地传递routeValues并最终呈现链接或发布到我想要的其他网址...

希望有所帮助

答案 2 :(得分:0)

这是你唯一的路线吗?如果没有,可能是另一个路由(先前声明)首先匹配,并且没有正确地获取profileKey参数。

答案 3 :(得分:0)

试试这个(未经测试的)代码

routes.MapRoute(
    "Profile", "Profile/{profileKey}", 
    new { controller = "Profile", action = "PublicView" }
);