我有一个带有可选“id”参数的页面路由。定义如下:
routes.MapPageRoute(null,
"projects/{operation}/{id}",
"~/Projects/ProjectWizard.aspx",
true,
new RouteValueDictionary(new
{
operation = "new",
id = UrlParameter.Optional
}),
new RouteValueDictionary(new
{
operation = @"new|edit",
id = @"\d*"
})
);
路由工作正常,但是如果我没有包含可选的“id”参数,当我到达页面时,我的代码在尝试转换为整数时失败。
var operation = RouteData.Values["operation"].ToString();
var projectId = RouteData.Values.ContainsKey("id") ? Convert.ToInt32(RouteData.Values["id"]) : 0;
只要我在这样的路径中传入ID,这就行得很好:
http://webapp/projects/edit/123
projectId
就像它应该的那样等于123。但如果我不包括ID:
http://webapp/projects/new
路由转到页面正常但我收到此错误:
无法将“System.Web.Mvc.UrlParameter”类型的对象强制转换为“System.IConvertible”。
它应该无法在路径数据值中找到密钥,然后将零分配给projectId
,但它不会。我一直在尝试不同的方法来检查“id”路由值的null,但它似乎并不那么喜欢。
答案 0 :(得分:2)
如果您在这里处理MVC控制器操作和MapRoute,那将是完美的。
在您的情况下我要做的只是在默认值中设置您的ID的默认值而不是UrlParameter.Optional,所以:
routes.MapPageRoute(null,
"projects/{operation}/{id}",
"~/Projects/ProjectWizard.aspx",
true,
new RouteValueDictionary(new
{
operation = "new",
id = "0"
}),
new RouteValueDictionary(new
{
operation = @"new|edit",
id = @"\d*"
})
);
然后简单地读取你的身份:
var operation = RouteData.Values["operation"].ToString();
var projectId = int.Parse(RouteData.Values["id"].ToString());