У меня есть базовое приложение MVC - сгенерированное из шаблона приложения MVC. Я создал базовый контроллер, который содержит обычные методы Index, Details, Edit и Create; У меня есть пара классов, один из которых содержит мой объект Person:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Description { get; set; }
}
И еще один, чтобы издеваться над поддельным DAL. Он не сохраняет данные в файл или базу данных, это всего лишь быстрый макет для целей этого прототипа:
public class PersonData
{
/* Fake out our initial repository */
static List<Person> People = new List<Person>()
{
new Person() { Id=1, FirstName="John", LastName="Doe", Description="King of the world" },
new Person() { Id=2, FirstName="Jane", LastName="Doe", Description="Chief whip cracker" }
};
/* Set up the indexing system */
private static int GetNextId()
{
return People.OrderByDescending(i => i.Id).First().Id + 1;
}
public static IEnumerable<Person> GetPeople()
{
return People;
}
public static Person GetPerson(int id)
{
if (id > People.OrderByDescending(i => i.Id).First().Id)
throw new ArgumentOutOfRangeException();
return People.Where(i => i.Id.Equals(id)).SingleOrDefault();
}
public static void Save(Person data)
{
/* Either remove the old one or assign a new ID */
if (data.Id != 0)
People.Remove(People.Where(i => i.Id.Equals(data.Id)).SingleOrDefault());
else
data.Id = GetNextId();
People.Add(data);
}
}
В контроллере нет ничего особенно интересного, вот отрывок из функции редактирования:
// GET: /Person/Edit/5
public ActionResult Edit(int id)
{
Person person = PersonData.GetPerson(id);
return View(person);
}
//
// POST: /Person/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Person person)
{
try
{
PersonData.Save(person);
return RedirectToAction("Details", person);
}
catch
{
return View(person);
}
}
Все работает, но я заметил пару любопытных аномалий, которые я не могу объяснить. Прежде всего, если я внесу изменения в человека в форме редактирования и сохраню его, все будет хорошо отражено на странице сведений. Затем я запускаю другой экземпляр браузера - Opera / Chrome / Wh независимо и ввожу страницу подробностей для этого человека. Я ожидал увидеть, что во втором браузере я буду видеть данные, предшествующие моим изменениям, потому что PersonData загружается только в память и не сохраняется - однако я вижу изменения, которые были сделаны в браузере 1 во втором браузере.
Я объяснил это тем, что я работаю на сервере разработки Visual Studio и предположил, что я просто получаю доступ к той же сессии. Чтобы подтвердить гипотезу, я добавил идентификатор сеанса на страницу сведений, ожидая увидеть тот же идентификатор сеанса, но я ошибся. У каждого сеанса свой идентификатор.
В дополнение к этому - идентификатор сеанса меняется при каждом обновлении страницы в обоих браузерах, и они всегда отличаются друг от друга.
Я не понимаю, почему это так, и задаюсь вопросом, может ли кто-нибудь объяснить:
- Почему данные из моего макета DAL сохраняются в обоих браузерах, когда они оба находятся в разных сеансах?
- Почему идентификатор сеанса не поддерживается при обновлении страницы?
Заранее спасибо