带有未命名的查询字符串参数的RedirectToAction

时间:2014-01-29 17:57:19

标签: c# asp.net asp.net-mvc

在MVC 2中,我有一个RedirectToAction调用,我需要传递所有的查询字符串参数。不幸的是我只能找到一种方法来传递命名的查询字符串参数是否有一种传递所有查询字符串参数的方法。

我们有一个命名参数id,但我们只想将所有其余参数附加到URL的末尾而不明确设置它们。

return RedirectToAction("index", "enquiry", new { id = enquiryCacheId.ToString()});

2 个答案:

答案 0 :(得分:0)

您无法在URL中传递COMPLEX对象,因此会杀死在新{}中传递复杂类型的选项。

您剩下的一个选项是对查询字符串进行编码,然后在“id”中发送。比如说,你有以下name=rami&gender=male的查询字符串。然后,您可以使用HttpUtility.UrlEncode()对其进行编码,然后将其设置为id=[encoded string]。在另一个操作(检索方)上,您可以获取id值,然后使用HttpUtility.UrlDecode()解码字符串。最后,您可以使用HttpUtility.ParseQueryString()将查询字符串拆分为NameValueCollection。

如果上述建议不符合您的要求。您需要将所有查询字符串参数添加到RedirectToAction()中的新{}。如果你想自定义它,那么你可能需要转到ASP.Net MVC Source code @CodePlex并制作自己的版本(我认为这不符合这种要求)。

答案 1 :(得分:0)

我有一个扩展方法,用于修改当前 URL的查询字符串:

public static string ModifyQueryString(this UrlHelper helper, NameValueCollection updates, IEnumerable<string> removes)
{
    var request = helper.RequestContext.HttpContext.Request;
    var url = request.Url.AbsolutePath;

    var query = HttpUtility.ParseQueryString(request.QueryString.ToString());

    updates = updates ?? new NameValueCollection();
    foreach (string key in updates.Keys)
    {
        query.Set(key, updates[key]);
    }

    removes = removes ?? new List<string>();
    foreach (string param in removes)
    {
        query.Remove(param);
    }

    if (query.HasKeys())
    {
        return string.Format("{0}?{1}", url, query.ToString());
    }
    else
    {
        return url;
    }
}

但是,如果您需要修改任意URL,则应该很容易修改。您只需要添加一个参数来接受任意URL,然后只需从?拆分传递的URL,而不是从HttpContext获取URL /查询字符串。其余的代码应该是一样的。