3

我只是在表单上输入姓名和年龄并将其发布到我的家庭控制器中的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");

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

}

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

谢谢

4

3 回答 3

7

myDB变量是HomeController类的实例变量。实例变量特定于一个类的一个实例,因为HomeController每次处理请求时都会创建一个新的类实例,所以当请求处理完成时,内存中的对象将被垃圾收集器创建并销毁。

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

static TheDB myDB;

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

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

如果您希望数据在请求和应用程序池关闭时保持不变,您将需要使用适当的数据库系统或将您的类序列化到某个位置的文件,以便可以重新加载它。

于 2013-08-27T11:35:32.033 回答
2

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

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

于 2013-08-27T11:36:26.387 回答
1

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

例如: int PersonId { 获取;放;}

实体框架将很好地用于包含关键数据成员的实体。所以试试这样。

    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;
于 2013-08-27T12:00:57.380 回答