c# - asp.net MVC Controller 不保留我的内存数据库

标签 c# asp.net-mvc razor

我只是在表单上输入姓名和年龄,然后将其发布到家庭 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/

相关文章:

c# - 在让 mvc 路由工作时缺少一些简单的东西

c# - 数据库中的 Asp.net MVC 页面标题

c# - 如何在 ASP.NET Core MVC 中完成这个 nl 到 br 的功能?

c# - 如何将图像保存到客户端 C 或 JavaScript 或 ActiveX

C# SQL连接OpenAsync不是异步的

c# - 为全局独立于 CultureInfo 的所有 DateTime 对象设置 StringFormat - WPF

asp.net-mvc - 如何使用editorfor隐藏主键输入字段

asp.net-mvc - 如何实现子菜单

c# - HTML Razor 中 Step 属性的自定义错误验证

c# - IEnumerable 在使用 Enumerable.Distinct 之前需要排序吗?