我有一个网址:
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
}
答案 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" }
);