MK_*_*Dev 10 c# asp.net-mvc asp.net-mvc-3
我正在研究一个看似简单的问题:在我的授权过滤器中,如果不满足其中一个条件,我正在检查一些事情,我需要从查询字符串中删除某些值并将用户重定向到结果URL.但是,这给了我一些比我想要的更多的问题.它看起来像这样:
public void OnAuthorization(AuthorizationContext filterContext)
{
if (!SomeCondition()) {
RedirectToCleanUrl(filterContext);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的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);
}
Run Code Online (Sandbox Code Playgroud)
首先,它不起作用,即使它确实如此,它也很难看.必须有更好的方法,对吧?我在这里错过了什么?
这是我最后编写的代码:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
您可能还想要查询字符串参数UrlEncode,但我会留给您.
| 归档时间: |
|
| 查看次数: |
8465 次 |
| 最近记录: |