具有QueryString参数的MVC Action没有键

时间:2012-02-04 13:23:06

标签: asp.net-mvc-3 query-string

给出如下的网址:

mysite.com/view/?http://www.youtube.com/

是否可以在操作的参数中捕获查询字符串值。

public ActionResult View(string query = "")
{
...
}

我可以通过调用QueryString[0]来获取该值,这很好。

当查询字符串具有如下键时,它可以正常工作:

mysite.com/view/?query=http://www.youtube.com/

public ActionResult View(string query = "")
{
...
}

但是我试图在没有钥匙的情况下这样做。

修改:更新问题以反映我正在做的事情。我将URL作为未编码的url作为查询字符串参数传递。

2 个答案:

答案 0 :(得分:0)

为什么不使用路由参数而不是查询字符串?

MapRoute(null, "view/{*urlParam}", ...

然后,您可以在不使用查询字符串的情况下将值作为操作方法的参数获取:

mysite.com/view/http://www.youtube.com/

public ActionResult View(string urlParam = "")
{
...
}

答案 1 :(得分:0)

可能有更简单的方法可以做到这一点,但这是一种方法......

制作自定义路线处理程序。如果URL-as-querystring本身包含查询字符串,则获取QueryString[0]将无法正常工作。因为最后的“=”,如果未编码,将被解释为查询值的开头。

即。 http://mysite.com/view/?http://www.youtube.com/?whatever=something会产生something

因此,我们自己解析网址:

public class NoKeyQueryStringHandler : MvcRouteHandler
{
    private string routeDataKey;

    // routeDataKey: the key to use for storing our query in routeData.Values
    public NoKeyQueryStringHandler(string routeDataKey)
    {
        this.routeDataKey = routeDataKey;
    }

    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string[] parts = requestContext.HttpContext.Request.Url
                            .OriginalString.Split(new [] {'?'}, 2);
        string value = parts.Length > 1 ? parts[1] : "";
        requestContext.RouteData.Values[routeDataKey] = value;

        return base.GetHttpHandler(requestContext);
    }

    // Handler that doesn't take care of querystring-in-querystring:
/*
    protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        NameValueCollection query = 
           requestContext.HttpContext.Request.QueryString;
        string value = query.Count > 0 ? query[0] : "";
        requestContext.RouteData.Values[routeDataKey] = value;

        return base.GetHttpHandler(requestContext);
    }
*/
}

注册路线的处理程序:

routes.Add(new Route(
    "view",
    new RouteValueDictionary(new { controller = "Whatever", action = "View"}), 
    new NoKeyQueryStringHandler("url")
    )
);

动作:

// Might not want to hide Controller::View, but oh well...
public ActionResult View(string url)
{
   return Content(url);
}

网址示例:

http://mysite.com/view/?http://www.youtube.com?whatever=something

...将致电:

WhateverController::View("http://www.youtube.com?whatever=something");

闻起来有点像滥用URL方案,但应该有用。