Постоянство модели в MVC3 - для моделей задано значение NULL и они не сохраняются, - PullRequest
1 голос
/ 05 января 2012

Я сохраняю свои данные в MVC3 и столкнулся с досадной проблемой:

Допустим, в моем конструкторе определено MyModel a = new MyModel() & MyModel b = new MySubmodel().

При посещении страницы 1:

 if (MyModel.MySubmodel== null)
  {
    //populate with defaults
  }else{
     //use existing model data
  }

На странице 1 я могу изменить значения, используя поля Html.textboxFor.Моя модель обновляется с помощью:

 [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Page1(Mysubmodel model)
        {

            MyModel.Mysubmodel = model;
            return RedirectToAction("Page2", "Tool");
        }

с использованием часов, и я вижу, что моя модель обновляется с новыми значениями!(что здорово!), однако, если я пытаюсь вернуться на свою страницу, чтобы проверить, сохранены ли результаты, они снова устанавливаются в нуль

Код:

 public class MyController : Controller
{
  //set up initial models
       public MyModel mainmodel = new MyModel ();
       public MySubModel submodel = new MySubModel ();
 public ActionResult Page1()
        {
            tempList.Clear();
            service.XmlParseDefault(Request); //Acquire defaults
            //setup model 
            //could possibly throw this into .services if it becomes a "fat controller"
            if (mymodel.submobdel == null)
            {
                //Apply default values
            }
        return View(submodel);
}

 [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Page1(submodel model)
        {

            mymodel.submodel = model;
            return RedirectToAction("Page2", "homecontroller");
        }


}

Ответы [ 2 ]

0 голосов
/ 05 января 2012

После выполнения перенаправления модель будет потеряна, поскольку контроллер будет воссоздан по запросу GET для Page2.

Таким образом, ваш вопрос, в конечном счете, как вы сохраняете модель подмодели во время перенаправления со страницы 1 на страницу 2.

Я думаю, это зависит от того, что содержит модель?

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

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

Или, если информация более постоянна, она может быть записана в базу данных, а модель, при необходимости, воссоздана с использованием этой информации.

0 голосов
/ 05 января 2012

HTTP: протокол запроса / ответа

Как только Сервер выполняет запрос, предоставляя Клиенту соответствующий ответ (может быть html, xml или json), все сбрасываетсяиз памяти.(Исключениями являются состояния сеанса).

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

Что если я использовал ViewData в моей обратной передаче для хранения MyModel?Буду ли я прав, думая, что это будет хранить всю модель (с подмоделями), а затем прочитать ее в конструкторе страницы.Также я предполагаю, что в отличие от сессий ViewData автоматически уничтожается после одного использования?

Не используйте ViewData, всегда используйте модель и передавайте их представлениям.Получить их, когда вы отправляете обратно.Присвойте модель обратной передачи новым экземплярам моделей и сохраните изменения в каком-либо постоянном месте.Как в базе данных или XML-файле.

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

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