如何将Request.QueryString传递给Url.Action?

时间:2011-04-28 11:46:30

标签: asp.net-mvc-3

我正在使用以下方法构建网址:

Url.Action("action", "controller");

我也喜欢将当前请求的查询字符串传递给该URL。 像下面的东西(但它不起作用):

Url.Action("action", "controller", Request.QueryString);

使用以下扩展名可以将QueryString转换为routevalues:

    public static RouteValueDictionary ToRouteValues(this NameValueCollection queryString)
    {
        if (queryString.IsNull() || queryString.HasKeys() == false) return new RouteValueDictionary();

        var routeValues = new RouteValueDictionary();
        foreach (string key in queryString.AllKeys)
            routeValues.Add(key, queryString[key]);

        return routeValues;
    }

使用扩展方法,以下工作正常:

Url.Action("action", "controller", Request.QueryString.ToRouteValues());

还有其他更好的方法吗? THX

3 个答案:

答案 0 :(得分:33)

如果您希望能够轻松地将其他路由值参数添加到Url.Action,请尝试使用此扩展方法(基于Linefeed),该方法接受匿名对象并返回RouteValueCollection:

public static RouteValueDictionary ToRouteValues(this NameValueCollection col, Object obj)
{
    var values = new RouteValueDictionary(obj);
    if (col != null)
    {
        foreach (string key in col)
        {
            //values passed in object override those already in collection
            if (key != null && !values.ContainsKey(key)) values[key] = col[key];
        }
    }
    return values;
}

然后你可以像这样使用它:

Url.Action("action", "controller", Request.QueryString.ToRouteValues(new{ id=0 }));

答案 1 :(得分:14)

扩展方法似乎是正确的,是最佳选择。

答案 2 :(得分:0)

这是我的解决方案,基于pwhe23的答案。 我想通过POST请求(由于Mvc.Grid)保留查询字符串参数,并且只使用一个HTTP GET操作。 CRUD操作由单个页面和模态对话框处理(用于插入/更新/删除)。

所以这是我的扩展名:

public static class MvcExtensions
{
    public static RouteValueDictionary ToRouteValues(this NameValueCollection col, Object obj = null)
    {
        var values = obj != null ? new RouteValueDictionary(obj) : new RouteValueDictionary();

        if (col == null) return values;

        foreach (string key in col)
        {
            //values passed in object are already in collection
            if (!values.ContainsKey(key)) values[key] = col[key];
        }
        return values;
    }
}

Controller中的用法(例如编辑操作):

    [HttpPost]
    public ActionResult Edit(MyModel model)
    {
        // Some stuff
        return RedirectToAction("Index", Request.QueryString.ToRouteValues());
    }

在View中生成的编辑表单(使用模态对话框):

 @using (Html.BeginForm("Edit", "SomeControllerName", Request.QueryString.ToRouteValues(), FormMethod.Post))
    {
        // Some stuff... e.g. dialog content
    }