繁体   English   中英

从MVC3中的querystring中删除一个值,然后重定向到结果URL

[英]Remove a value from querystring in MVC3 and redirect to the resulting URL

我正在处理一个看似简单的问题:在我的“授权”过滤器中,我正在检查是否满足以下条件之一的几件事,我需要从查询字符串中删除某些值,并将用户重定向到结果URL。 但是,这给了我更多的问题。 看起来像这样:

public void OnAuthorization(AuthorizationContext filterContext)
{
    if (!SomeCondition()) {
        RedirectToCleanUrl(filterContext);
    }
}

在我的RedirectToCleanUrl中,我剥离了查询字符串,并尝试将它们重定向到新的url。 看起来像这样:

private void RedirectToCleanUrl(AuthorizationContext filterContext)
{
    var queryStringParams = new NameValueCollection(filterContext.HttpContext.Request.QueryString);

    // Stripping the key
    queryStringParams.Remove("some_key");

    var routeValueDictionary = new RouteValueDictionary();

    foreach (string x in queryStringParams)
    {
        routeValueDictionary.Add(x, queryStringParams[x]);
    }

    foreach (var x in filterContext.RouteData.Values)
    {
        routeValueDictionary.Add(x.Key, x.Value);
    }

    filterContext.Result = new RedirectToRouteResult(routeValueDictionary);
}

首先,它不起作用,即使它起作用,也很难看。 一定有更好的办法吧? 我在这里想念什么?

这是我最终编写的代码:

protected void StripQueryStringAndRedirect(System.Web.HttpContextBase httpContext, string[] keysToRemove)
{
    var queryString = new NameValueCollection(httpContext.Request.QueryString);

    foreach (var key in keysToRemove)
    {
        queryString.Remove(key);
    }

    var newQueryString = "";

    for (var i = 0; i < queryString.Count; i++)
    {
        if (i > 0) newQueryString += "&";
        newQueryString += queryString.GetKey(i) + "=" + queryString[i];
    }

    var newPath = httpContext.Request.Path + (!String.IsNullOrEmpty(newQueryString) ? "?" + newQueryString : String.Empty);

    if (httpContext.Request.Url.PathAndQuery != newPath)
    {
        httpContext.Response.Redirect(newPath, true);
    }
}

您可能还想对查询字符串参数进行UrlEncode编码,但我将由您自己决定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM