Сохранение параметра строки запроса на всем сайте в ASP.Net MVC 2

http: www.site1.com/? sid = 555

Я хочу, чтобы параметр и значение sid сохранялись независимо от того, опубликована ли форма или нажата ссылка.

Если пользователь переходит к представлению, которое реализует разбиение на страницы, тогда другие параметры в строке запроса должны быть добавлены после sid.

http: www.site1.com/? sid = 555 & page = 3

Как я могу сделать это в Asp.Net Mvc 2?

[Изменить]

URL-адрес, который я упомянул вверху, будет точкой входа в приложение, поэтому sid будет включен в ссылку.

В приложениях есть такие ссылки, как:

<%= Html.ActionLink("Detail", "Detail", new { controller = "User", 
                                              id = item.UserId })%>

следует перейти по адресу:
http: www.site1.com/user/detail/3? sid = 555

Этот вопрос отличается от того, что упоминает Дейв, поскольку параметр querystring сохраняется на всем сайте.


person Picflight    schedule 14.05.2010    source источник
comment
возможный дубликат Как сохранить значения строки запроса в asp. net mvc?   -  person mathieu    schedule 15.05.2012


Ответы (2)


Во-первых, я бы сказал, что если значение необходимо сохранять на протяжении всего сеанса, вы должны сохранить его в сеансе и проверить, что оно по-прежнему действует при каждом вызове действия. Это можно сделать с помощью настраиваемого атрибута действия, который вы добавляете к требуемому контроллеру / действиям. Если значение требуется, тогда, когда значение проверено, вы можете повторно перейти на страницу входа в систему или аналогичную, если ее нет или срок ее действия истек.

Во всяком случае, это говорит о том, что я думал, что у меня получится заставить его работать. Моей первой мыслью было бы создать атрибут фильтра настраиваемого действия, который взял бы значение строки запроса и сохранил его в сеансе в OnActionExecuting, а затем OnResultExecuted добавил бы ключ обратно в строку запроса. Но поскольку QueryString in Request - это коллекция, доступная только для чтения, вы не можете сделать это напрямую.

Итак, что теперь доступно вам?

Вариант №1 - Добавить его во все вызовы Html.ActionLink () вручную

or ...

Вариант № 2 - Заменить версию ActionLink, которая автоматически добавляет значение для вас. Этого можно добиться вот так. Хотя я бы не рекомендовал это делать.

Начните с настраиваемого атрибута.

public class PersistQueryStringAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var sid = filterContext.RequestContext.HttpContext.Request.QueryString["sid"];

        if (!string.IsNullOrEmpty(sid))
        {
            filterContext.RequestContext.HttpContext.Session["sid"] = sid;
        }

        base.OnActionExecuting(filterContext);
    }
}

Все, что это делает, - это проверяет строку запроса запроса на наличие требуемого ключа и, если он доступен, добавляет его в сеанс.

Затем вы заменяете метод расширения ActionLink на один из ваших, который добавляет значение в.

public static class HtmlHelperExtensions
{
    public static MvcHtmlString ActionLink<TModel>(this HtmlHelper<TModel> helper, string text, string action, string controller, object routeValues)
    {
        var routeValueDictionary = new RouteValueDictionary(routeValues);

        if (helper.ViewContext.RequestContext.HttpContext.Session["sid"] != null)
        {
            routeValueDictionary.Add("sid", helper.ViewContext.RequestContext.HttpContext.Session["sid"]);    
        }

        return helper.ActionLink(text, action, controller, routeValueDictionary, null);
    }
}

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

[PersistQueryString]
public ActionResult Index()
{
    ViewData["Message"] = "Welcome to ASP.NET MVC!";

    return View();
}

Примечание

Когда значение запроса помещается в сеанс, оно будет применяться на протяжении всего сеанса. Если вы хотите проверить, что значение есть и одинаково для каждого запроса, вам нужно будет выполнить некоторую проверку в методе переопределения атрибутов.

Наконец-то

Я сделал это чисто как упражнение «можно ли это сделать». Я настоятельно не рекомендую это делать.

person WestDiscGolf    schedule 27.07.2010

Возможный дубликат:

Как сохранить значения строки запроса в asp.net mvc?

Я согласен с принятым ответом на вопрос, указанный выше. Параметры строки запроса не предназначены для сохранения данных. Если параметр (например, sid = 555) предназначен для сохранения в течение сеанса, используйте состояние сеанса или свою модель, чтобы сохранить эти данные для использования во всех запросах.

person Dave Swersky    schedule 14.05.2010