我只是在表单上输入姓名和年龄,然后将其发布到家庭 Controller 中的 ListAll 操作。但是 Controller 不会记住输入的所有姓名和年龄,即它不会持久保存。
附言很抱歉代码太长了,但这一切都很基本,不应该让事情复杂化
这是我的 Index.Html 中的代码(我可以在其中输入一个人的姓名和年龄)
@using(Html.BeginForm())
{
@Html.ValidationSummary();
@Html.LabelFor(p=>p.Name)
@Html.EditorFor(p=>p.Name)
@Html.LabelFor(p=>p.Age)
@Html.EditorFor(p=>p.Age)
<input type="submit" value="Add" />
}
@Html.ActionLink("View All Person", "ListAll");
这是我的 DBContext 类,
public class TheDB: DbContext
{
public List<Person> persons = new List<Person>();
}
我的个人类(class)
public class Person
{
[Required]
public string Name { get; set; }
[Required]
public string Age{get;set;}
}
我的 Controller
public class HomeController : Controller
{
TheDB myDB ;
public HomeController()
{
myDB = new TheDB();
}
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(Person person)
{
//ignore model validation for now
myDB.persons.Add(person);
myDB.SaveChanges(); //update: adding this didn't work either
return View(person);
}
public ActionResult ListAll()
{
return View(myDB.persons.ToList());
}
最后是 ListAll.cshtml,它应该显示所有添加到内存数据库中的人,但它显示一个空白页面
@model IEnumerable<HtmlForms.Models.Person>
@using HtmlForms.Models
@foreach(var p in Model )
{
@p.Name;
@p.Age;
}
我错过了什么?如果我在 ListAll 方法中手动添加两个 person 对象 IN 并将其传递给 View,它就可以工作。但是上面的代码没有。
谢谢
最佳答案
myDB
变量是 HomeController
类的实例变量。实例变量特定于类的一个实例,并且由于每次处理请求时都会创建 HomeController
类的新实例,因此将创建内存中的对象,然后由垃圾收集器销毁当请求完成处理时。
你可以让变量static
并且只实例化它一次,像这样:
static TheDB myDB;
public HomeController()
{
if (myDB == null)
{
myDB = new TheDB();
}
}
但是,这只会持续到您的应用程序池运行的时间,并且默认情况下,应用程序池会在一段时间不活动(以及错误和操作系统崩溃等其他情况)后停止。
如果您希望您的数据在请求和应用程序池关闭时保持不变,您将需要使用适当的数据库系统或将您的类序列化到某处的文件中,以便它可以重新加载。
关于c# - asp.net MVC Controller 不保留我的内存数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18464100/