ASP.NET MVC: Лучшие практики для хранения состояния сеанса в подобном мастеру приложении

, Если Вы используете ссылку в качестве пути к всего , выполняют некоторый код JavaScript (вместо того, чтобы использовать промежуток как D4V360, значительно предложенный), просто сделайте:

<a href="javascript:(function()%7Balert(%22test%22)%3B%7D)()%3B">test</a>

при использовании ссылки с onclick для навигации не используйте href = "#" как нейтрализация, когда JavaScript выключен. Это является обычно очень раздражающим, когда пользователь нажимает на ссылку. Вместо этого предоставьте ту же ссылку, которую onclick обработчик предоставил бы, если это возможно. Если Вы не можете сделать этого, пропустите onclick и просто используйте URI JavaScript в href.

5
задан Igor Brejc 6 August 2009 в 08:58
поделиться

5 ответов

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

5
ответ дан 18 December 2019 в 14:49
поделиться

Можно ли сохранить данные мастера во временной таблице в базе данных? Когда пользователь завершает работу мастера, данные копируются из временной таблицы и удаляются. Временная таблица включает отметку времени для удаления любых старых незавершенных данных.

3
ответ дан 18 December 2019 в 14:49
поделиться

Как сказала Дейзи, его не нужно кэшировать. Вы также можете использовать скрытые поля формы. Поскольку они могут отображаться на один и тот же объект при каждом действии контроллера, вы можете постепенно создавать объект через последовательные страницы.

//Here's a class we're going to use
public class Person
{
  public int Age {get;set;}
  public string Name {get;set;}

  public Person()
  {
  }
}

//Here's the controller
public Controller PersonCreator
{
  public ActionResult CreatePerson()
  {
    //Posting from this page will go to SetPersonAge, as the name will be set in here.
    return View();
  }

  public ActionResult SetPersonAge(Person person)
  {
    //This should now have the name and age of the person
    return View(person);
  }
}

//Here is your SetPersonAge, which contains the name in the model already:
<%= Html.Hidden("Name", Model.Name) %>
<%Html.TextBox("Age") %>

И это почти все.

2
ответ дан 18 December 2019 в 14:49
поделиться

Я могу предложить еще несколько вариантов

  1. Наличие всего мастера в виде единой страницы с вкладками, показывающими и скрывающими контент через javascript на стороне клиента. Однако из-за этого начальная страница может загружаться медленнее.

  2. Кэширование данных на сервере с использованием блока приложения кэширования (или чего-то подобного). Это позволит всем пользователям совместно использовать один экземпляр этих данных вместо того, чтобы дублировать их во всех сеансах. Теперь, когда данные более легкие, вы можете убедить клиента разрешить сохранение в сеансе.

1
ответ дан 18 December 2019 в 14:49
поделиться

Я столкнулся с той же проблемой, и, хотя мои требования немного проще (сохранение состояния только для нескольких строк), мое решение может сработать для вас. Мне также было бы интересно услышать мнение других об этом подходе.

В итоге я сделал следующее: в контроллере я просто выгружаю данные, которые мне нужны, в свойство Session контроллера, а затем вытаскиваю их в следующий раз, когда они мне понадобятся. Примерно так для вашей ситуации:

//Here's the controller
public Controller PersonCreator  
{  
    public ActionResult CreatePerson()  
    {    
        //get the age out of the session
        int age = (int)(Session["age"]);
        //do something with it...
        return View();  
    }  
    public ActionResult SetPersonAge(Person person)  
    {  
        //put the age in the session
        Session.Add("age", person.Age);
        return View(person);  
    }
}

Что мне нравится в этом, так это то, что мне не нужно размещать кучу скрытых параметров на моих страницах просмотра.

0
ответ дан 18 December 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: