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