Мне кажется, мы не хотим никакого ViewState кунг-фу или других механизмов, эта структура предназначена для возврата к сети без состояния.
Пример, который вы предоставили, довольно легко сделать без какого-либо «вида состояния кунг-фу», используя возможности, которые уже есть в MVC. «Пользователь добавляет человека и видит это на следующем экране». Позвольте мне написать простой PersonController
, который делает именно то, что вы хотите:
public ActionResult Add()
{
return View(new Person());
}
[HttpPost]
public ActionResult Add(PersonViewModel myNewPersonViewModel)
{
//validate, user entered everything correctly
if(!ModelState.IsValid)
return View();
//map model to my database/entity/domain object
var myNewPerson = new Person()
{
FirstName = myNewPersonViewModel.FirstName,
LastName = myNewPersonViewModel.LastName
}
// 1. maintains person state, sends the user to the next view in the chain
// using same action
if(MyDataLayer.Save(myNewPerson))
{
var persons = MyDataLayer.GetPersons();
persons.Add(myNewPersion);
return View("PersonGrid", persons);
}
//2. pass along the unique id of person to a different action or controller
//yes, another database call, but probably not a big deal
if(MyDataLayer.Save(myNewPerson))
return RedirecToAction("PersonGrid", ...etc pass the int as route value);
return View("PersonSaveError", myNewPersonViewModel);
}
Теперь я чувствую, что вы хотите, чтобы человек был на еще одной странице после PersonSaveSuccess
или чего-то еще. В этом случае вы, вероятно, захотите использовать TempData[""]
, который является одним сеансом обслуживания и сохраняет только состояние от одного запроса к другому или каким-либо образом управлять традиционным Session[""]
самостоятельно.
Что меня смущает, так это то, что вы, вероятно, все равно идете в БД, чтобы получить всех своих людей. Если вы спасете человека, он должен быть в вашей коллекции людей при следующем вызове вашего GetPersons()
. Если вы не используете Ajax, то в каком состоянии вы пытаетесь сохранить?