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

Lin*_*eed 39 asp.net-mvc-3

我正在使用该方法构建一个url:

Url.Action("action", "controller");
Run Code Online (Sandbox Code Playgroud)

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

Url.Action("action", "controller", Request.QueryString);
Run Code Online (Sandbox Code Playgroud)

可以使用以下扩展名将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;
    }
Run Code Online (Sandbox Code Playgroud)

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

Url.Action("action", "controller", Request.QueryString.ToRouteValues());
Run Code Online (Sandbox Code Playgroud)

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

pwh*_*e23 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Url.Action("action", "controller", Request.QueryString.ToRouteValues(new{ id=0 }));
Run Code Online (Sandbox Code Playgroud)

  • +1我把它添加到我的Utility类 (2认同)
  • 第一行可以缩短为`var values = new RouteValueDictionary(obj);`.由于`RouteValueDictionary(object)`接受空值(它实例化一个空字典),因此三元不是必需的. (2认同)
  • 您还可以将 `obj` 参数设为可选,如下所示:`ToRouteValues(this NameValueCollection col, Object obj = null) `。然后,如果您只想发送查询字符串作为路由数据,则可以使用不带参数的 `ToRouteValues()`。 (2认同)

Dar*_*rov 14

扩展方法似乎是正确的,是要走的路.