Во-первых, я бы сказал, что если значение необходимо сохранить в течение сеанса, то вы должны сохранить его в сеансе и проверить, что оно остается действительным при каждом вызове действия. Это можно сделать с помощью пользовательского атрибута действия, который вы добавляете в контроллер / необходимые действия. Если значение требуется, тогда, когда значение проверено, вы можете перенаправить на страницу входа в систему или аналогичную, если она отсутствует или срок ее действия истек.
Во всяком случае, это сказал, что я думаю, что у меня будет трещина в том, чтобы заставить его работать. Моей первой мыслью было бы создать атрибут фильтра настраиваемого действия, который бы взял значение строки запроса и сохранил его в сеансе в 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();
}
Примечание
Когда значение запроса будет введено в сеанс, оно будет применяться на протяжении всего сеанса. Если вы хотите проверить, что значение присутствует и то же самое в каждом запросе, вам потребуется выполнить некоторую проверку в методе переопределения атрибутов.
Наконец
Я сделал это просто как упражнение «можно ли это сделать». Я очень рекомендую против этого.