Сложный сценарий с ASP .NET MVC 3 без использования Session - PullRequest
0 голосов
/ 19 декабря 2011

У меня есть модель класса House:

public class House
{
    public House()
    {
        Residents = new List<Resident>();
    }

    public virtual string Name { get; set; }     
    ...  
    public virtual IList<Resident> Residents{ get; set; }
}

public class Resident
{
    public virtual string Name { get; set; }
    public virtual int Age{ get; set; }
    public virtual House House { get; set; }
}

Итак, на мой взгляд, Create (House), мне нужно добавить жителей. Поэтому я добавил кнопку «Добавить резидента», которая открывает модальный интерфейс JQuery с Create (Resident), и когда пользователь нажимает «Подтвердить», модал закрывается и обновление сетки моего резидента ...

Моя проблема в том, где я сохраняю этот список ... Я сделал это с помощью Session ... Но я бы хотел сделать это без Session ...

Что я сделал (Контроллер моего дома):

  [HttpGet]
  public ActionResult AddResident(Resident resident)  //Called when user confirms modal Resident
  {
      Residents.Add(resident);

      return PartialView("_Residents", Residents);
  }

  public Collection<Resident> Residents
  {
      get
      {
          if (Session["Residents"] == null)
          {
              var _lista = new Collection<Resident>();

              Session["Residents"] = _lista;
              return _lista;
          }
          return (Collection<Resident>)Session["Residents"];
      }
      set { Session["Residents"] = value; }
  }

Итак, как правильно делать такой сценарий без сеанса?

Спасибо

Ответы [ 3 ]

2 голосов
/ 19 декабря 2011

Вы не слишком далеко от цели использования сессии.Поскольку у MVC нет довольно раздутого (и часто уродливого) представления, вам нужно где-то хранить свою коллекцию жителей.У вас есть три варианта:

1.Используйте подход с редактируемым списком.

Здесь вы каждый раз публикуете весь список, чтобы убедиться, что ваша модель сохраняет свое состояние.(посмотрите на этот пример: http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/).

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

2. Создайте клиентское решение javascript.

Это добавит новые элементы в ваш список и при этом сохранит значения для них.элементы в скрытых входах, гарантирующие, что полная модель будет передана в конце. Это может быть сложно, так как вам нужно управлять индексом каждого элемента в разметке, которую создает javascript. Например, измените это:

name="House.Residents[0].Name" id="House.Residents_0__Name"

НаИндекс, который вам нужен, когда вы добавляете элемент. Этот подход я обычно использую, но он может быть сложным. Код для получения возвращенного пустого шаблона редактора из MVC и сброса его индекса выглядит следующим образом:

function (response, index, oldindex) {
            // Reset editor template index reference
            response.attr("id", response.attr("id").replace("[" + oldindex + "]", "[" + index + "]"));
            var inputList = response.find("input, select");
            inputList.each(function (num) {
                var thisEl = $(this);
                // Allow for dbl input with checkbox
                if (thisEl.attr("id"))
                    thisEl.attr("id", thisEl.attr("id").replace("_" + oldindex + "__", "_" + index + "__"));
                thisEl.attr("name", thisEl.attr("name").replace("[" + oldindex + "]", "[" + index + "]"));
            });
            var spanList = response.find("span");
            spanList.each(function (num) {
                var thisEl = $(this);
                if (thisEl.attr("data-valmsg-for")) {
                    thisEl.attr("data-valmsg-for", thisEl.attr("data-valmsg-for").replace("[" + oldindex + "]", "[" + index + "]"));
                }
            });
            var labelList = response.find("label");
            labelList.each(function (num) {
                var thisEl = $(this);
                if (thisEl.attr("for")) {
                    thisEl.attr("for", thisEl.attr("for").replace("_" + oldindex + "__", "_" + index + "__"));
                }
            });
            return response;
        }

3. Используйте сессию (или временные данные).

, чтобы временно сохранить ваш список, безусловно, самый простой, но, вероятно, наименее изящный.

1 голос
/ 19 декабря 2011

Хотя он все еще использует Session за сценой, TempData - это способ перейти , если вы хотите сохранить данные при вызовах действий.

ДействиеМетод может хранить данные в объекте TempDataDictionary контроллера, прежде чем он вызовет метод RedirectToAction контроллера для вызова следующего действия.Значение свойства TempData хранится в состоянии сеанса.

Хорошая часть заключается в том, что сеанс будет автоматически очищаться после чтения (в методе обновления сетки).Это действительно то, что означает «временные данные».

Вот пример кода с TempData:

public ActionResult AddResident(Resident resident)
{
    IList<Resident> residents = PeristResident(resident);
    return PartialView("_Residents", residents);
}

private IList<Resident> PeristResident(Resident resident)
{
    IList<Resident> residents = Residents; // this operation can empty TempData by reading it
    residents.Add(resident);
    Residents = residents; // so we persists collection after read
    return residents;
}

private IList<Resident> Residents
{
    get
    {
        object results;
        if (TempData.TryGetValue("Residents", out results) == false)
        {
            var list = new List<Resident>();
            return list;
        }
        return (IList<Resident>)results;

    }
    set { TempData["Residents"] = value; }
}
1 голос
/ 19 декабря 2011

Два варианта:

  1. Cookies
  2. Скрытые поля.

Но я думаю, что сессия - хороший подход для этого сценария.

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