У меня есть базовое приложение 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/Whatever и введите страницу сведений для этого человека. Я ожидал увидеть, что во втором браузере я увижу данные, предшествующие моим изменениям, потому что PersonData загружается только в память и не сохраняется, однако я вижу изменения, которые были сделаны в браузере 1 во втором браузере.
Я сделал это, потому что я работаю на Visual Studio Development Server и предположил, что я просто получаю доступ к тому же сеансу. Чтобы доказать гипотезу, я добавил идентификатор сеанса на страницу сведений, ожидающую увидеть тот же идентификатор сеанса, но я ошибся. Каждый сеанс имеет другой идентификатор.
Далее - идентификатор сеанса изменяется с обновлением каждой страницы в обоих браузерах, и они всегда отличаются друг от друга.
Я не понимаю, почему это так и интересно, может ли кто-нибудь объяснить:
Заранее спасибо
Ваш поддельный репозиторий объявляется как статический:
/* 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" }
};
Статика существует для жизни процесса, она не привязана к сеансу ASP.NET. Поэтому все ваши сеансы будут видеть данные до перезапуска процесса веб-сервера (в вашем случае процесс веб-сервера разработки VS).
Используете ли вы статические объекты? Если это так, они распределяются между каждым экземпляром времени выполнения.
Возможно, вы могли бы поделиться реализацией своего "DAL mock"? Нельзя быть уверенным, но это похоже на ваш макет, немного испорченный, вы сначала это заметили?