MVC, как передать модель между двумя action?

OracleLover

public ActionResult Check(SuperModel model)
{
 return RedirectToAction("Approve")
}

public ActionResult Approve(SuperModel model)
{
 // как здесь получить модель которая пришла в Check?
}
Можно использовать TempData, но это некрасиво и чревато тем что пользователь просто нажав ф5 может потерять модельку.
24 ответа

OracleLover

Да нормально с TempData, а еще лучше - обойтись одним экшен.


OracleLover

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


OracleLover

Такой вариант не подойдет?
public ActionResult Check(SuperModel model)
{
 return View("Approve", model)
}


OracleLover

Такой вариант не подойдет?
public ActionResult Check(SuperModel model)
{
 return View("Approve", model)
}
в этом случае акшн не выполняется


OracleLover

подождем МСУ )


OracleLover

короч пока запихнул в сессию модельку - подождем более красивого варианта.


OracleLover

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


OracleLover

подождем более красивого варианта.
Это вам не визард с ViewSate ), обычные пост/гет запросы, чудеса закончились )


OracleLover

public ActionResult Check(SuperModel model)
{
 return RedirectToAction("Approve")
}

public ActionResult Approve(SuperModel model)
{
 // как здесь получить модель которая пришла в Check?
}
Можно использовать TempData, но это некрасиво и чревато тем что пользователь просто нажав ф5 может потерять модельку.
RedirectToAction используйте


OracleLover

Pavluha,Вот так RedirectToAction("Message", "Error", new { message = Resources.Strings.ErrorDelete });


OracleLover

Pavluha,Вот так RedirectToAction("Message", "Error", new { message = Resources.Strings.ErrorDelete });
фих там


OracleLover

Эмм, а как вам некрасивые варианты с сессией? :)примерно так:
public ActionResult Check(SuperModel model)
{
Session["chkModel"] = model;
 return RedirectToAction("Approve")
}

public ActionResult Approve()
{
 var checkModel = (SuperModel)Session["chkModel"];

 Session.Remove("chkModel");

 return View();
 // как здесь получить модель которая пришла в Check?
}
можно в бехайндер даже засунуть, чтобы Хотя лично мне вариантик не оч нравится


OracleLover

У себя использовал следующий вариант:Модель преобразовывал в текст (сериализовал) и хранил в hidden field, на следующей странице доставал значение из temp дата и десиреализовал обратно в объект. Подробно об этой реализации здесь Пример на mvc2, но переделать на mvc3 не проблема.Хранить объект в сессии - данные могут быть потеряны в связи с перегрузкой сайта, или время сессии вышло, или сервер захочет освободить немного места для других целей...


OracleLover

Хранить объект в сессии - данные могут быть потеряны в связи с перегрузкой сайта, или время сессии вышло, или сервер захочет освободить немного места для других целей...
да, это одна из причин, почему этот вариант не нравится (хотя сессию можно ведь хранить как угодно)при серриализации и хранении в hidden-field лучше хранить в base64 + хешь по данным и secret key, чтобы после чека нельзя было подменить данные


OracleLover

У себя использовал следующий вариант:Модель преобразовывал в текст (сериализовал) и хранил в hidden field, на следующей странице доставал значение из temp дата и десиреализовал обратно в объект.
И, кстати, получаем ViewState ))


OracleLover

И, кстати, получаем ViewState ))
Совершенно верно=)Но для одной модели, а не для всей страницы, и полностью контролируемый.


OracleLover

я так и храню в сессии. Просто мне казалось гораздо удобнее бы было придумать спецконтейнер для этого. Надо будет в майкрософт написать претензию :)


OracleLover

я так и храню в сессии. Просто мне казалось гораздо удобнее бы было придумать спецконтейнер для этого. Надо будет в майкрософт написать претензию :)
а чем не подходит вариант предложенный rudevelop?


OracleLover

Извращения продолжаются )
public ActionResult Check(SuperModel model)
{
 // логика
 if(IsValid)
 return View("Approve", model);
 else
 return View("Order", model);
}
а так ?


OracleLover

Не понимаю вообще "проблемы". Её нет.


OracleLover

а так ?
а что так?скажем у меня есть экшн delete! я хочу просто удалить фотку и нехочу возвращать вью delete с надписью "фотка удалена"я хочу вернуться по адресу где я был до вызова экшна delete и увидеть, что фотки тупо нету!вполне естественно, что это будет так
return RedirectToAction("Album")
сервер в ответ по экшну delete выдаст браузеру заголовок http://en.wikipedia.org/wiki/HTTP_locationбраузер перезапросит сервер по новому адресу и выдаст страницу по GET ALBUMГде там нарисовались хидден-филды (которые никак не попадают в ответ сервера с delete) и
return View("Order", model); //по запросу http://aaa.com/delete будет разметка http://aaa.com/album
так и остаётся за пределом понимания!сессия - неплохое хранилище данных между запросами!!!


OracleLover

БД - отличное хранилище данных между запросами! Можно сжечь комп и продолжить потом на новом! :)Может раскроете суть задачи? Для чего передавать модель между действиями? Чтобы что реализовать?


OracleLover

Где там нарисовались хидден-филды (которые никак не попадают в ответ сервера с delete) и
ЧиВо o_0 ?
сессия - неплохое хранилище данных между запросами!!!
Плохое )


OracleLover

Чтобы что реализовать?
Мастера1 Шаг - задайте параметры 2 Шаг - введите что хотите3 Шаг - позырьте все ли вы правильно сделали4 Шаг - подверждайте