我有一个基本的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的开发服务器中运行并假设我只是访问同一个会话。为了证明这个假设,我将会话ID添加到详细信息页面,期望看到相同的会话ID,但我错了。每个会话都有不同的ID。
除此之外 - 会话ID随着两个浏览器中的每次页面刷新而变化,并且它们总是彼此不同。
我不明白为什么会这样,并且想知道是否有人可以解释:
提前致谢
答案 0 :(得分:6)
您的假存储库被声明为静态:
/* 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会话。因此,在重新启动Web服务器进程之前,所有会话都将看到数据(在您的情况下是VS开发Web服务器进程)。
答案 1 :(得分:2)
您使用的是静态物体吗?如果是这样,它们将在运行时的每个实例之间共享。
答案 2 :(得分:0)
也许你可以分享你的“DAL模拟”的实现?一个不能确定,但似乎有点像你的模拟有点瑕疵,你先检查一下吗?