Sla*_*sko 2 routing asp.net-mvc-routing asp.net-mvc-2
如何在global.asax中定义路由,以便能够使用可为空的参数和逗号作为分隔符?
我正在尝试为我的搜索用户页面实施路由规则
"{Controller}/{Action},{name},{page},{status}"
Run Code Online (Sandbox Code Playgroud)
来自Global.asax的完整条目:
routes.MapRoute(
"Search",
"{controller}/{action},{name},{page},{status}",
new { controller = "User", action = "Find",
name = UrlParameter.Optional,
page = UrlParameter.Optional,
status = UrlParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
当我输入所有参数时,如上定义的例程工作正常,但是当某些参数等于null时路由失败(例如“ user / find ,,”)
根据Clicktricity的注释,下面是处理请求的动作方法的唯一性:
public ActionResult Find(string userName, int? page, int? status)
{
// [...] some actions to handle the request
}
Run Code Online (Sandbox Code Playgroud)
一开始,我是通过VS调试器测试路由的,现在我使用的是Phil的Haack博客上介绍的路由调试器。该工具确认-没有正确处理具有空值的路由(或者我做错了;))
据我所知,.Net路由不允许您执行多个可为空的参数。仅当缺少多个参数时,多个参数才有效,并且分隔符也缺失,因此您将在
用户/查找,鲍勃,2,实时 用户/查找,鲍勃,2 用户/查找,鲍勃 用户/查找
使用查询字符串执行您要执行的操作要容易得多。
根据评论进行编辑:
如果有必要,那么您可以尝试以这种方式进行操作(尽管这不是一个好方法)
更改路径以匹配
{Controller}/{Action},{*parameters}
确保对动作和控制器施加约束,以便将约束限制为尽可能少。
重命名将使您的完整列表带到其他位置的每个操作,为每个操作添加标准前缀将是最干净的方法,然后添加[NonAction]属性。添加一个带有字符串的原始名称的新方法,该字符串是用逗号分隔的变量字符串。在此方法中,分割字符串并返回原始操作,并传入分割中的值。
所以你从:
public ActionResult Find(string name, int page, string status){
//Do stuff here
return View(result);
}
Run Code Online (Sandbox Code Playgroud)
至
public ActionResult Find(string parameters){
string name;
int? page;
string status;
//split parameters and parse into variables
return FindAction(name, page, status);
}
[NonAction]
public ActionResult FindAction(string parameters){
//Do what you did in your previous Find action
return View(results);
}
Run Code Online (Sandbox Code Playgroud)