Как я могу держать свойства модели между действиями (asp.net mvc) - PullRequest
2 голосов
/ 20 июля 2011

Вот моя модель:

public class MyModel
    {
        public int BaseTypeField { set; get; }

        public MyType UserTypeField { set; get; }
    }

В первом действии я передал MyModel для просмотра в обычном режиме:

public ActionResult Action1()
    {
        MyModel model = new MyModel();
        //do something with model.UserTypeField
        return View(model);
    }

В Action1View я могу легко изменить модель. BaseTypeField сHtmlHelper, но я не хочу изменять model.UserTypeField в этом представлении (также я не могу сохранить его в HiddenFor).Затем Action1View отправляет модель другому действию:

public ActionResult Action2(MyModel model)
    {
        //model.UserTypeField is lost here
        return View();
    }

Здесь возникает проблема: как я могу сохранить / сохранить модель. UserTypeField за исключением чего-то вроде Session ??

Ответы [ 4 ]

0 голосов
/ 20 июля 2011

TempData [] предназначена для хранения элементов между действиями, но использует сессию.Если ключи не помечены с помощью Keep, они удаляются после выполнения следующего действия.

Если вы хотите избежать полной остановки Session, вам придется сериализовать ваш объект и отправить его клиенту в представлении.(например, в скрытой переменной формы), а затем десериализовать его обратно в Action2.

Если вы хотите использовать TempData (что будет самым простым, если вы по какой-то причине не сможете использовать сессию), синтаксис будет простобыть:

public ActionResult Action1()
{
    MyModel model = new MyModel();
    //do something with model.UserTypeField

    TempData["UserTypeField"] = model.UserTypeField;

    return View(model);
}

public ActionResult Action2(MyModel model)
{
    model.UserTypeField = TempData["UserTypeField"];

    return View();
}
0 голосов
/ 20 июля 2011

У вас есть несколько вариантов сохранения состояния при действиях контроллера:

  1. Сохраните его в скрытом элементе ввода в представлении (хотя я ценю, что вы говорите, что не можете, и естьмножество веских причин, по которым это может иметь место).
  2. Сохраните его в состоянии сеанса.
  3. Сохраните его в базе данных приложения (но тогда вы также можете использовать состояние сеанса).
  4. Сохраните в cookie.Вы можете создать HttpCookie и добавить его в HttpContext.Current.Response.Cookies в Action1 и прочитать его из HttpContext.Current.Request.Cookies в Action2.

Если у вас только небольшой объем данныхи у меня нет причин использовать Session State в другом месте, я бы, вероятно, выбрал вариант cookie.Но Session State существует именно для этой цели.Не бойтесь использовать его, если это правильно.

0 голосов
/ 20 июля 2011

Каждое действие должно иметь параметр, который имеет только свойства для полей, которые вы хотели бы принять из запроса. Остальная часть объекта должна быть снова загружена из хранилища данных. Другими словами, не заставляйте Action2 брать свойство, которое принимает всю модель, так как это позволит вашим потребителям непреднамеренно изменить больше свойств, чем они могут.

Это может показаться большой работой на каждом шаге, но вы избавите себя от многих головных болей, не выполняя всю проверку для всех полей, которые вы не хотите изменять. Также можно легко загрузить оставшуюся часть модели из хранилища данных, если ее обернуть в функцию.

0 голосов
/ 20 июля 2011

Что ж, если вы не хотите использовать состояние сеанса, тогда ваш единственный вариант - передать информацию клиенту и попросить его передать ее обратно с запросом.Один из способов сделать это - использовать cookie.Другим может быть использование скрытого поля формы.Вы должны включить это поле в свой ответ на Action1, и браузер автоматически отправит его в запросе к Action2 (при условии, что вы используете форму POST для вызова действия).

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