asp.net MVC控制器不会在内存数据库中保留

iAt*_*_it 3 c# asp.net-mvc razor

我只是在表单上输入名称和年龄,并将其发布到我的家庭控制器中的ListAll操作.但是控制器不记得输入的所有名称和年龄,即它不会持久存在.

Ps对长代码感到抱歉,但它非常基本,不应该复杂化

这是我的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");
Run Code Online (Sandbox Code Playgroud)

这是我的DBContext类,

public class TheDB: DbContext
    {
        public List<Person> persons = new List<Person>();
    }
Run Code Online (Sandbox Code Playgroud)

我的班级

 public class Person
    {
        [Required]
        public string Name { get; set; }
        [Required]
        public string Age{get;set;}
    }
Run Code Online (Sandbox Code Playgroud)

我的控制器

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());
        }
Run Code Online (Sandbox Code Playgroud)

最后是ListAll.cshtml,它应该显示添加到内存数据库中的所有人,但它显示一个空白页面

@model IEnumerable<HtmlForms.Models.Person>
@using HtmlForms.Models

@foreach(var p in Model )
{
    @p.Name;
    @p.Age;

}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?如果我手动添加两个的对象IN的ListAll方法并传递给视图,它works.But上面的代码没有.

谢谢

Sea*_*rey 7

myDB变量是HomeController该类的实例变量.实例变量特定于一个类的实例,并且由于HomeController每次处理请求时都会创建类的新实例,因此内存对象将在请求完成处理时由垃圾收集器创建然后销毁.

您可以创建变量static并仅将其实例化一次,如下所示:

static TheDB myDB;

public HomeController()
{
    if (myDB == null)
    {
        myDB = new TheDB();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这只会在应用程序池运行时持续,默认情况下,应用程序池在一段时间不活动(以及错误和其他情况,如操作系统崩溃)后停止.

如果希望数据在请求和应用程序池关闭期间保持不变,则需要使用正确的数据库系统或将类序列化到某个文件,以便可以重新加载.

  • @iAteABug_And_iLiked_it注意另外,使实例静态将与向页面发出请求的所有用户共享它. (2认同)