Действие MVC с параметром QueryString без ключа - PullRequest
1 голос
/ 04 февраля 2012

Учитывая URL как:

mysite.com / вид /? http://www.youtube.com/

Можно ли зафиксировать значение строки запроса в параметрах действия.

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

Я могу получить значение, позвонив QueryString[0], что хорошо.

Работает нормально, когда строка запроса имеет такой ключ:

mysite.com / вид /? = Запрос http://www.youtube.com/

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

Но я пытаюсь сделать это без ключа.

Редактировать : обновлен вопрос, чтобы отразить то, что я делаю. Я передал URL как незашифрованный URL в качестве параметра строки запроса.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2012

Возможно, есть гораздо более простые способы сделать это, но вот один из подходов ...

Создание собственного обработчика маршрута. Получение QueryString[0] не будет работать, если строка URL-адреса-запроса включает в себя саму строку запроса. Поскольку последнее «=», если оно не закодировано, будет интерпретировано как начало значения запроса.

т.е. http://mysite.com/view/?http://www.youtube.com/?whatever=something приведет к something.

Итак, вместо этого мы сами разбираем URL:

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

Пример URL:

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

... позвонит:

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

Пахнет "немного", как злоупотребление схемой URL, но должно работать.

0 голосов
/ 04 февраля 2012

Почему бы не сделать это с параметром маршрута вместо строки запроса?

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

Затем вы можете получить значение в качестве аргумента для вашего метода действия без использования строки запроса:

mysite.com / вид / http://www.youtube.com/

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