Подтвердить что ты не робот

Как передать Request.QueryString в Url.Action?

Я строю url используя метод:

Url.Action("action", "controller");

Мне нравится передавать запрос для текущего запроса в этот URL-адрес. Что-то вроде следующего (но это не работает):

Url.Action("action", "controller", Request.QueryString);

Преобразование QueryString в значения маршрута возможно со следующим расширением:

    public static RouteValueDictionary ToRouteValues(this NameValueCollection queryString)
    {
        if (queryString.IsNull() || queryString.HasKeys() == false) return new RouteValueDictionary();

        var routeValues = new RouteValueDictionary();
        foreach (string key in queryString.AllKeys)
            routeValues.Add(key, queryString[key]);

        return routeValues;
    }

С помощью метода расширения выполняется следующее:

Url.Action("action", "controller", Request.QueryString.ToRouteValues());

Есть ли другой лучший способ? спасибо

4b9b3361

Ответ 1

Метод расширения кажется правильным и является способом перехода.

Ответ 2

Если вы хотите легко добавить дополнительные параметры маршрута в свой Url.Action, попробуйте этот метод расширения (на основе Linefeed), который принимает анонимный объект и возвращает RouteValueCollection:

public static RouteValueDictionary ToRouteValues(this NameValueCollection col, Object obj)
{
    var values = new RouteValueDictionary(obj);
    if (col != null)
    {
        foreach (string key in col)
        {
            //values passed in object override those already in collection
            if (!values.ContainsKey(key)) values[key] = col[key];
        }
    }
    return values;
}

Затем вы можете использовать его так:

Url.Action("action", "controller", Request.QueryString.ToRouteValues(new{ id=0 }));

Ответ 3

Здесь мое решение основано на ответе pwhe23. Я хотел сохранить параметры строки запроса через запросы POST (из-за Mvc.Grid) и использовать только одно действие для HTTP GET. Действия CRUD обрабатываются одной страницей и модальными диалогами внутри (для вставки/обновления/удаления).

Итак, здесь мое расширение:

public static class MvcExtensions
{
    public static RouteValueDictionary ToRouteValues(this NameValueCollection col, Object obj = null)
    {
        var values = obj != null ? new RouteValueDictionary(obj) : new RouteValueDictionary();

        if (col == null) return values;

        foreach (string key in col)
        {
            //values passed in object are already in collection
            if (!values.ContainsKey(key)) values[key] = col[key];
        }
        return values;
    }
}

Использование в контроллере (например, действие "Редактировать" ):

    [HttpPost]
    public ActionResult Edit(MyModel model)
    {
        // Some stuff
        return RedirectToAction("Index", Request.QueryString.ToRouteValues());
    }

Форма для редактирования, сгенерированная в представлении (используется модальный диалог):

 @using (Html.BeginForm("Edit", "SomeControllerName", Request.QueryString.ToRouteValues(), FormMethod.Post))
    {
        // Some stuff... e.g. dialog content
    }