Я не уверен, хотите ли вы сохранить ссылку на объект для всего сеанса пользователя или хотите, чтобы он был только для одного запроса. В любом случае вы можете использовать Global.asax, чтобы поместить объект в область видимости ваших контроллеров и представлений:
Сначала объект области запроса:
Global.asax.cs:
protected void Application_BeginRequest(object sender, EventArgs e)
{
var myObject = SomeMethodThatGetsMyObject();
HttpContext.Current.Items.Add("MyObjectKey", myObject);
}
protected void Application_EndRequest(object sender, EventArgs e)
{
HttpContext.Current.Items.Remove("MyObjectKey");
}
Тогда в контроллерах вы можете получить доступ к этому так:
public ViewResult ThisAction()
{
var myObject = HttpContext.Current.Items["MyObjectKey"] as MyObjectType;
// placing this in view data provides easy access in the view.
ViewData["MyObject"] = myObject;
return View();
}
Затем в представлениях вы можете получить доступ к этому из ViewData или напрямую из HttpContext
<% var myObject = ViewData["MyObject"] as MyObjectType; %>
<!-- If for some reason you don't want it in view data
you can use the HttpContext directly instead -->
<% var myObject = HttpContext.Current.Items["MyObjectKey"] as MyObjectType; %>
Во-вторых, объект области действия сеанса:
Этот метод будет удерживать объект в области действия до завершения сеанса пользователя.
Global.asax.cs
protected void Session_Start(object sender, EventArgs e)
{
var myObject = SomeMethodThatGetsMyObject();
Session["MyObjectKey"] = myObject;
}
protected void Session_End(object sender, EventArgs e)
{
Session.Remove("MyObjectKey");
}
Тогда в контроллерах вы можете получить доступ к этому так:
public ViewResult ThisAction()
{
var myObject = Session["MyObjectKey"] as MyObjectType;
// placing this in view data provides easy access in the view.
ViewData["MyObject"] = myObject;
return View();
}
Затем в представлениях вы можете получить доступ к этому из ViewData или напрямую из HttpContext
<% var myObject = ViewData["MyObject"] as MyObjectType; %>
<!-- If for some reason you don't want it in view data
you can use the Session directly instead -->
<% var myObject = Session["MyObjectKey"] as MyObjectType; %>
Лучшие практики
Стоит отметить, что для улучшения этого дизайна можно применить некоторые передовые практики. С одной стороны, вместо передачи и использования всего объекта в вашем представлении, обычно лучше просто передать нужные значения в данные представления, оставляя представление свободным от кода присваивания и преобразования. (помните, что если вы собираетесь выполнять кастинг в вашем представлении, вам придется учитывать вероятность того, что кастинг не пройдет и в вашем представлении!)
Кроме того, желание иметь пользовательский объект, который всегда доступен «на всякий случай», является чем-то вроде антишаблонов. Возможно, было бы полезно узнать, какова цель этого объекта, чтобы можно было предложить соответствующий шаблон, чтобы помочь решить вашу проблему в соответствии с известными лучшими практиками.
Я надеюсь, что где-то в этом я смог немного помочь.