Сохранение параметра строки запроса по всему сайту в ASP.Net MVC 2 - PullRequest
4 голосов
/ 14 мая 2010

HTTP: www.site1.com/ с.и.д. = 555

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

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

HTTP: www.site1.com/ с.и.д. = 555 & страница = 3

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

[Изменить]

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 27 июля 2010

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

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

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

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

или ...

Опция № 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();
}

Примечание

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

Наконец

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

1 голос
/ 14 мая 2010

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

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

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

...