MVC3 中带有两个可选参数的路由不起作用 [英] Route with Two optional parameters in MVC3 not working
问题描述
我的应用程序中使用了以下类型的 url.
<块引用>localhost/admin/userdetail/id
localhost/admin/userdetail/id/true
localhost/admin/userdetail/id/true/success
这是我的管理员控制器
<块引用>bool inSaveAction,字符串状态可选
[授权]public ActionResult UserDetail(string Id, bool inSaveAction, string status){}[HttpPost、授权、验证AntiForgeryToken]公共 ActionResult SaveUserDetail(UserDetailViewModel viewModel){User userToSave = new User();AdminService.UpdateUser(userToSave);//这是调用上面的函数,因为它发送了所有3个参数return RedirectToAction("UserDetail", new { Id = viewModel.Id,inSaveAction = true, status = "success" });}
<块引用>
以下情况不起作用
@Html.ActionLink("DisplayName", "UserDetail", new { id = Model.Id })
在 Global.asax 中
routes.MapRoute("UserDetail","UserDetail/{id}",新的{控制器 = "管理员",action = "UserDetail",id = UrlParameter.Optional});
我如何制作 inSaveAction &状态作为我的 UserDetail 操作的可选参数?
您的路由配置中缺少参数.为了使用不同的可选参数(如 Phil Haack 的帖子中所述),您需要定义多个路由
routes.MapRoute("UserDetail-WithStatus","UserDetail/{id}/{inSaveAction}/{status}",新的{控制器 = "管理员",action = "UserDetail",//没有可选的});routes.MapRoute("UserDetail-WithoutStatus","UserDetail/{id}/{inSaveAction}",新的{控制器 = "管理员",action = "UserDetail",//没有可选的});routes.MapRoute("UserDetail-WithoutSaveAction","UserDetail/{id}",新的{控制器 = "管理员",action = "UserDetail",id = UrlParameter.Optional});
然后创建链接:
@Html.ActionLink("Link", "Index", "Admin", new { id = 1, inSaveAction = true, success = "success" }, null)
您还需要将可选参数设置为可为空,否则如果 id 或 inSaveAction 缺失,您将获得异常.
public ActionResult UserDetail(int?id, bool?inSaveAction, string status){}
I have a following types of url used in my Application.
localhost/admin/userdetail/id
localhost/admin/userdetail/id/true
localhost/admin/userdetail/id/true/success
Here is my Admin Controller
bool inSaveAction, string status are optional
[Authorize]
public ActionResult UserDetail(string Id, bool inSaveAction, string status)
{
}
[HttpPost, Authorize, ValidateAntiForgeryToken]
public ActionResult SaveUserDetail(UserDetailViewModel viewModel)
{
User userToSave = new User();
AdminService.UpdateUser(userToSave);
//This is calling the above function as it sending all 3 params
return RedirectToAction("UserDetail", new { Id = viewModel.Id,
inSaveAction = true, status = "success" });
}
Below case is not working
@Html.ActionLink("DisplayName", "UserDetail", new { id = Model.Id })
In Global.asax
routes.MapRoute("UserDetail",
"UserDetail/{id}",
new
{
controller = "Admin",
action = "UserDetail",
id = UrlParameter.Optional
}
);
How can i make inSaveAction & status as optional parameter for my UserDetail action?
You're missing the parameters in your route config. In order to make this work with different parameters optional (as in Phil Haack's post), you need to define multiple routes
routes.MapRoute("UserDetail-WithStatus",
"UserDetail/{id}/{inSaveAction}/{status}",
new
{
controller = "Admin",
action = "UserDetail",
// nothing optional
}
);
routes.MapRoute("UserDetail-WithoutStatus",
"UserDetail/{id}/{inSaveAction}",
new
{
controller = "Admin",
action = "UserDetail",
// nothing optional
}
);
routes.MapRoute("UserDetail-WithoutSaveAction",
"UserDetail/{id}",
new
{
controller = "Admin",
action = "UserDetail",
id = UrlParameter.Optional
}
);
And then create links with:
@Html.ActionLink("Link", "Index", "Admin", new { id = 1, inSaveAction = true, success = "success" }, null)
You'll also need to set the optional parameters as nullable, otherwise you'll get exceptions if id or inSaveAction are missing.
public ActionResult UserDetail(int? id, bool? inSaveAction, string status)
{
}
这篇关于MVC3 中带有两个可选参数的路由不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!