Asp.net mvc 3 如何将Request.QueryString传递给Url.Action?

Asp.net mvc 3 如何将Request.QueryString传递给Url.Action?,asp.net-mvc-3,Asp.net Mvc 3,我正在使用以下方法构建url: Url.Action("action", "controller"); 我还希望将当前请求的查询字符串传递到该url中。 类似于以下内容(但不起作用): 通过以下扩展,可以将QueryString转换为RouteValue: public static RouteValueDictionary ToRouteValues(this NameValueCollection queryString) { if (queryString

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

Url.Action("action", "controller");
我还希望将当前请求的查询字符串传递到该url中。 类似于以下内容(但不起作用):

通过以下扩展,可以将QueryString转换为RouteValue:

    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

扩展方法似乎是正确的,而且是正确的方法。

如果您希望能够轻松地向Url添加其他路由值参数。操作,请尝试此扩展方法(基于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 }));

以下是基于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;
    }
}
控制器中的用法(例如编辑操作):

在视图中生成的编辑表单(使用模式对话框):


如果查询字符串包含两个具有相同键的键/值,这将引发异常,因为有人可以在浏览器中更改查询字符串。谢谢,这个问题是一个非常有用的答案!什么是
querystring.IsNull()
?是自定义扩展吗?因为我在任何地方都看不到它。第一行可以缩短为
var values=newroutevaluedictionary(obj)。由于
RouteValueDictionary(object)
接受空值(它实例化一个空字典),因此三元值是不必要的。您还可以将
obj
参数设置为可选参数,如下所示:
ToRouteValues(this NameValueCollection col,object obj=null)
。然后,如果只想将查询字符串作为路由数据发送,则可以使用不带参数的
ToRouteValues()
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;
    }
}
    [HttpPost]
    public ActionResult Edit(MyModel model)
    {
        // Some stuff
        return RedirectToAction("Index", Request.QueryString.ToRouteValues());
    }
 @using (Html.BeginForm("Edit", "SomeControllerName", Request.QueryString.ToRouteValues(), FormMethod.Post))
    {
        // Some stuff... e.g. dialog content
    }