ASP.NET Mvc-可为空的参数和逗号作为分隔符

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博客上介绍的路由调试器。该工具确认-没有正确处理具有空值的路由(或者我做错了;))

Cha*_*hao 5

据我所知,.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)