我只需在表单上输入姓名和年龄,然后将其发布到我的家庭控制器中的 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,它就可以工作。但上面的代码并没有。
三江源
答案 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;