【问题标题】:How to pass Request.QueryString to Url.Action?如何将 Request.QueryString 传递给 Url.Action?
【发布时间】:2011-04-28 11:46:30
【问题描述】:

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

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

我也喜欢将当前请求的查询字符串传递到该 url。 类似于以下内容(但它不起作用):

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

使用以下扩展可以将 QueryString 转换为路由值:

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

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

【问题讨论】:

  • 如果查询字符串包含具有相同键的两个键/值,这将引发异常,这总是有可能的,因为有人可以在他们的浏览器中更改查询字符串
  • 谢谢,这个问题真的很有帮助! querystring.IsNull() 是什么?是自定义扩展吗?因为我在任何地方都看不到它。

标签: asp.net-mvc-3


【解决方案1】:

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

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

【讨论】:

  • 第一行可以缩短为var values = new RouteValueDictionary(obj);。由于RouteValueDictionary(object) 接受空值(它实例化一个空字典),所以不需要三元。
  • 您也可以将obj 参数设为可选参数,如下所示:ToRouteValues(this NameValueCollection col, Object obj = null) 。那么如果你只想发送查询字符串作为路由数据,那么你可以使用ToRouteValues()不带参数。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是我基于 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;
        }
    }
    

    在控制器中的使用(例如编辑操作):

        [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
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多