使用列表或数组在MVC3中构建查询字符串



我有一个搜索表单,其中包含返回日历的页面。在顶部,我有一些搜索条件,如果它只有一个值,一切都很好,但如果它是一个列表,就不行了。当我想在我的模型中为下个月建立url时,我有这样的东西:

public ActionResult GetUrl()
    {
        var action = GetBaseAction();
        if (SelectedDivisions.Any()) action.AddRouteValue("SelectedDisions", SelectedDivisions.ToArray());
        if (RoomId.HasValue) action.AddRouteValue("RoomId", RoomId.Value);
        if (TeacherId.HasValue) action.AddRouteValue("TeacherId", TeacherId.Value);
        if (Month.HasValue) action.AddRouteValue("Month", Month.Value);
        if (Year.HasValue) action.AddRouteValue("Year", Year.Value);
        if (Day.HasValue) action.AddRouteValue("Day", Day.Value);
        return action;
    }

Wich将参数添加到下个月的URL:

http://afi.local/coursesession/calendar?Month=9&年份=2012&天=18&ViewType=每周

但由于你可以选择多个部门,这是一个复选框列表,所以当我发布我的表格时,我会得到这个URL:

http://afi.local/coursesession/calendar?Month=9&年份=2012&天=18&ViewType=每周&SelectedDivisions=1&SelectedDivisions=2

问题是,如果我添加两次相同的键,就会引发异常,而且我不知道如何在查询字符串中使用多个除法来重建我的URL。

谢谢你的帮助!

这可能是一个重复:

我如何添加整数列表来路由

简单的答案是:你不能使用helper。你必须手工建造。

String.Join可能是一个选项:

 String.Join(",", SelectedDivisions.ToArray())

我在这里找到了一个解决方案:https://stackoverflow.com/a/717732/245836

我基本上是这样做的:

var routeValues = new RouteValueDictionary();
            for (var i = 0; i < SelectedDivisions.Count; i++)
            {
                routeValues["SelectedDivisions[" + i + "]"] = SelectedDivisions[i];
            }
            action.AddRouteValues(routeValues);

生成的URL不是很干净,但绑定工作正常:

http://afi.local/coursesession/calendar?SelectedDivisions%5B0%5D=1&所选分段%5B1%5D=2&所选分段%5B2%5D=3&月份=9&年份=2012&天=11&ViewType=每周

所以现在我可以复制粘贴该URL,它将适用于我日历中的任何搜索。