Как получить доступ к сеансу и другому веб-контексту из класса MVC 6 TagHelper?

Мне нужно либо вызвать какой-либо метод контроллера/действия, либо, по крайней мере, вызвать мои собственные вспомогательные методы, которые будут использовать переменную сеанса. Как это сделать из метода Process TagHelper


person blueharoon    schedule 03.05.2016    source источник


Ответы (1)


ViewContextAttribute предоставит доступ к контексту (объектам и т. д.), который также доступен для вашего представления внутри вашего помощника по тегам.

Внутри вспомогательного класса тега добавьте:

[ViewContext]
public ViewContext ViewContext { get; set; }

... затем вы можете создать свойства для использования в оставшейся части вашего вспомогательного тега, чтобы получить доступ к определенным ресурсам, например:

protected HttpRequest Request => ViewContext.HttpContext.Request;
protected HttpResponse Response => ViewContext.HttpContext.Response;
protected ISession Session => ViewContext.HttpContext.Session;
protected ITempDataDictionary TempData => ViewContext.TempData;

А затем используйте их из своего метода Process:

В моем случае мне нужно было передать значения между вспомогательной функцией родительского (заключенного) тега и вспомогательной функцией дочернего (закрытого) тега. Я мог бы создать пользовательский объект и внедрить его в оба, но, поскольку существует небольшая вероятность того, что я сделаю это в пакете NuGet, я не хотел обременять своих пользователей настройкой этого DI в их startup.cs.

Итак, я добавил это в метод Process() родительского вспомогательного тега:

TempData.Set("Test", "Passed the test!");

... а затем добавил это в дочерний помощник по тегам:

object result;
if (TempData.TryGetValue("Test", out result))
{
  string success = result.ToString();
}

... и это сработало. Я использовал TempData, но это зависит от сеанса. Вы можете сделать то же самое с сеансом.

person Bob Tabor    schedule 21.09.2016
comment
Вот ветка, содержащая список других атрибутов, используемых для внедрения определенных типов контекста: github.com/aspnet/ MVC/вопросы/4744 - person Bob Tabor; 21.09.2016