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

时间:2010-10-11 10:13:53

标签: asp.net-mvc-2 routing asp.net-mvc-routing

我应该如何在global.asax中定义路由才能使用可空参数和昏迷作为分隔符?

我正在尝试为我的搜索用户页面实施路由规则,例如

"{Controller}/{Action},{name},{page},{status}"

Global.asax的完整条目:

    routes.MapRoute(
        "Search",
        "{controller}/{action},{name},{page},{status}",
            new { controller = "User", action = "Find", 
                name = UrlParameter.Optional,
                page = UrlParameter.Optional,
                status = UrlParameter.Optional  } 
    );
当我输入所有参数时,

如上定义的例程工作正常,但是当某些参数等于空路由失败时(例如“user / find ,,,”)


根据下面的Clicktricity评论 - 处理请求的行动方式的单一作品:

public ActionResult Find(string userName, int? page, int? status)
{
    // [...] some actions to handle the request

}

一开始我通过VS调试器测试路由,现在我正在使用Phil's Haack blog中描述的路由调试器。该工具确认 - 没有正确处理具有空值的路由(或者我做错了;))

1 个答案:

答案 0 :(得分:4)

据我所知.Net路由不允许你做多个这样的可空参数。多个参数只有在缺少从末尾向后工作且分隔符也丢失的情况下才有效,因此您可以获得匹配

user/find,bob,2,live
user/find,bob,2
user/find,bob
user/find

使用查询字符串可以轻松实现您的目标。

根据评论进行编辑:

如果有必要,那么你可以尝试这样做(虽然这不是一个好方法)

更改您的路径以匹配

{Controller}/{Action},{*parameters}

确保对动作和控制器设置约束,以便将其限制为尽可能少。

将将您的完整列表添加到其他内容的每个操作重命名,为每个操作添加标准前缀将是最干净的方法,并添加[NonAction]属性。添加一个带有字符串的原始名称的新方法,此字符串是逗号分隔的变量字符串。在此方法中,拆分字符串并返回传递拆分值的原始操作。

所以你来自:

public ActionResult Find(string name, int page, string status){
    //Do stuff here
    return View(result);
}

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);
}