2013-08-27 30 views
2

我只是在我的表單上輸入名稱和年齡並將其發佈到ListAll在我的家庭控制器中的操作。但是控制器並不記錄記錄輸入的所有名稱和年齡,即它不會持續它。該asp.net MVC控制器不會堅持我的內存數據庫

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方法並將其傳遞給視圖,它的工作原理。但上面的代碼沒有。

三江源

+1

您是否在任何時候調用'SaveChanges'來將更改提交給數據庫? – CodingIntrigue

+0

我剛更新了這個問題。我添加它按照你的建議和奇怪的,它仍然沒有工作:( –

+0

你在哪裏存儲實例'TheDB'?如果只是'myDB = new TheDB();'這將初始化一個空白數據庫在每頁加載 - 你需要堅持它*在某處* – CodingIntrigue

回答

6

myDB變量是用於HomeController類的一個實例變量。實例變量特定於類的一個實例,並且由於每次處理請求時都會創建類的新實例,所以在請求完成處理時,內存中的對象將被創建並由垃圾收集器銷燬。

你可以把這些變量static,只實例化一次,像這樣:

static TheDB myDB; 

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

然而,這隻會只要你的應用程序池,跑最後一棒,並默認應用程序池後停止不活動期間(以及錯誤和其他情況,如操作系統崩潰)。

如果您希望數據在請求和應用程序池關閉期間持久保存,則需要使用適當的數據庫系統或將您的類序列化到某個文件,以便可以重新加載。

+0

Oh ... t帽子現在非常有意義....非常感謝..... –

+2

@iAteABug_And_iLiked_it注意此外,使實例靜態將與所有請求頁面的用戶共享。 – Kami

+0

@Sean,所以當我使用實際的數據庫並使用Entityframework時,我的dbcontext類應該是靜態的呢? –

2

控制器的生命週期不會跨越多個請求,因此無法讓控制器擁有跨多個請求的內存數據庫。

您可以在應用程序啓動時(在Global.asax.cs中)創建數據庫作爲靜態對象。但是,它不再是「持久」,而是應用程序重新啓動時它將被重置。

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; 
+0

其實這個緩存是一個很好的建議。謝謝。 –