ASP.NET MVC - государство и архитектура - PullRequest
3 голосов
/ 01 марта 2010

После сеанса парного программирования возник интересный вопрос, на который, я думаю, я знаю ответ.

Вопрос: Есть ли какой-либо другой желаемый способ в ASP.NET MVC сохранить «состояние», кроме записи в базу данных или текстовый файл?

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

Я думаю, что мы не хотим никакого ViewState кунг-фу или других механизмов, эта структура предназначена для возврата к сети без состояния.

Ответы [ 3 ]

1 голос
/ 01 марта 2010

А как насчет сеанса пользователя? Есть много действительных вариантов использования для хранения вещей в сессии. А как насчет распределенной системы кэширования, такой как memcached? Вы также, кажется, пропускаете строку запроса, которая является отличным средством сохранения состояния (? Page = 2) Мне кажется, что это другие желательные методы для сохранения состояния между запросами ...?

0 голосов
/ 01 марта 2010

ASP.NET MVC предлагает более чистый способ работы с хранилищем сеансов с использованием привязки модели. Вы можете написать собственный механизм связывания модели, который может предоставлять экземпляры из сеанса в ваши методы действия. Посмотри.

0 голосов
/ 01 марта 2010

Мне кажется, мы не хотим никакого 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, то в каком состоянии вы пытаетесь сохранить?

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