Как разделить объект между контроллерами и страницами просмотра? - PullRequest
0 голосов
/ 23 августа 2009

В настоящее время я переопределяю событие OnLoad ASP.NET ViewPage. Так что объект может быть доступен всем страницам просмотра. Но теперь мне нужно иметь возможность доступа к этому объекту в контроллере; Каков наилучший способ сделать это?

По сути, я хочу поделиться объектом (который уникален для каждого пользователя веб-приложения ... так что синглтона нет) с страницами просмотра и контроллерами.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 23 августа 2009

Я не уверен, хотите ли вы сохранить ссылку на объект для всего сеанса пользователя или хотите, чтобы он был только для одного запроса. В любом случае вы можете использовать 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; %>

Лучшие практики

Стоит отметить, что для улучшения этого дизайна можно применить некоторые передовые практики. С одной стороны, вместо передачи и использования всего объекта в вашем представлении, обычно лучше просто передать нужные значения в данные представления, оставляя представление свободным от кода присваивания и преобразования. (помните, что если вы собираетесь выполнять кастинг в вашем представлении, вам придется учитывать вероятность того, что кастинг не пройдет и в вашем представлении!)

Кроме того, желание иметь пользовательский объект, который всегда доступен «на всякий случай», является чем-то вроде антишаблонов. Возможно, было бы полезно узнать, какова цель этого объекта, чтобы можно было предложить соответствующий шаблон, чтобы помочь решить вашу проблему в соответствии с известными лучшими практиками.

Я надеюсь, что где-то в этом я смог немного помочь.

0 голосов
/ 24 августа 2009

Я согласен с Уиллом. вставьте объект в базовый класс контроллеров, из которого происходят ваши основные контроллеры.

посмотрите здесь, чтобы узнать, что говорят другие >> ViewModel-Best-Practices

0 голосов
/ 23 августа 2009

Похоже, вы хотите передать некоторые переменные сеанса в ваши представления. Возможно, лучший способ сделать это - создать класс модели базового представления, который загружает эти фрагменты информации из объекта сеанса для вас. Затем этот базовый объект можно использовать для создания классов модели адаптированного представления для каждого представления.

0 голосов
/ 23 августа 2009

Поместите это в базовый класс ваших контроллеров?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...