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

时间:2013-08-27 11:27:07

标签: c# asp.net-mvc razor

我只需在表单上输入姓名和年龄,然后将其发布到我的家庭控制器中的 ListAll 操作即可。但控制器并没有记住输入的所有姓名和年龄,即它不会持续存在。

P.S。对于长代码感到抱歉,但它非常基本,不应该使事情复杂化

这是我的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>();
    }

我的班级

 public class Person
    {
        [Required]
        public string Name { get; set; }
        [Required]
        public string Age{get;set;}
    }

我的控制器

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;

}

我错过了什么?如果我手动添加两个对象 IN ListAll方法并将其传递给View,它就可以工作。但上面的代码并没有。

三江源

3 个答案:

答案 0 :(得分:7)

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

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

static TheDB myDB;

public HomeController()
{
    if (myDB == null)
    {
        myDB = new TheDB();
    }
}

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

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

答案 1 :(得分:2)

控制器的生命周期不会跨越多个请求,因此不可能让控制器拥有跨越多个请求的内存数据库。

您可以在应用程序启动时(在Global.asax.cs中)创建数据库作为静态对象。但是,它不再是“持久”,而是在应用程序重新启动时重置它。

答案 2 :(得分:1)

模型的Person类不包含主键字段,如

例如:int PersonId {get;设置;}

实体框架可以很好地用于包含密钥数据库的实体。 所以试试这样。

    public class Person
    {
        [Key]
        public int Id {get; set;}

        [Required]
        public string Name { get; set; }

        [Required]
        public string Age{get;set;}
    }

还尝试使用HttpContext.Cache来维护内存中的数据。

HttpContext.Cache["Persons"]= MyDB.persons;