2012-04-21 50 views
0

我是新來的MVC3,但到目前爲止我已經設法與我的代碼相處得很好。添加到窗體中的模型,然後重新顯示窗體以添加更多

現在,我想製作一個簡單的表單,它允許用戶輸入一個文本字符串,表示僱員的姓名。然後,我會希望將這個表單提交併存儲在我的模型中,並以某種形式列出。然後,表單應該重新顯示,用for-each循環寫出我已經添加的名稱。當我完成並繼續前進時,我需要將這些信息存儲到我的數據庫中。

我弄不清楚,是如何存儲這個臨時信息,直到我把它推到我的數據庫。每當我提交我就可以做,但這導致了我很多頭痛。

希望你們看看我想要做什麼,並有一個很棒的解決方案。 :)

這是我一直在努力做一個簡化版本:

型號

public class OrderModel 
{ 
    public virtual ICollection<Employees> EmployeesList { get; set; } 

    public virtual Employees Employees { get; set; } 
} 

public class Employees 
{ 
    [Key] 
    public int ID { get; set; } 

    public string Name { get; set; } 
} 

查看

@model OrderModel 
@{ 
    if (Model.EmployeesList != null) 
    { 
     foreach (var c in Model.EmployeesList) 
     { 
      @c.Name<br /> 
     } 
    } 
} 
@using(Html.BeginForm()) 
{ 
    @Html.TextBoxFor(m => m.Employees.Name) 

    <input type="submit" value="Add"/> 
} 

控制器

[HttpPost] 
public ActionResult Index(OrderModel model) 
{ 
    model.EmployeesList.Add(model.Employees); 
    // This line gives me the error: "System.NullReferenceException: Object reference not set to an instance of an object." 

    return View(model); 
} 

回答

1

我想你應該通過燃燒員工列表到頁面中處理這個問題。現在,你並沒有以任何方式讓你的表格識別列表。

在EditorTemplates文件名爲Employees:

@model Employees 

@Html.HiddenFor(m => m.ID) 
@Html.HiddenFor(m => m.Name); 

在你看來:

@using(Html.BeginForm()) 
{ 
    @Html.EditorFor(m => m.EmployeesList) 
    @Html.TextBoxFor(m => m.Employees.Name) 

    <input type="submit" value="Add"/> 
} 

[HttpPost] 
public ActionResult Index(OrderModel model) 
{ 
    if (model.EmployeesList == null) 
     model.EmployeesList = new List<Employees>(); 

    model.EmployeesList.Add(model.Employees); 
    return View(model); 
} 

作爲額外的獎勵,以這種方法,這將是很容易添加AJAX使用戶永遠不會有當他們添加新員工時離開頁面(您可能只需在javascript中插入一個新的隱藏值並避免使用ajax,這取決於您是否在您的文章中添加了您的列表)。

+0

非常感謝!這種方法非常完美。 – holaq 2012-04-21 12:23:29

1

我認爲這將是一個很好的使用TempData。您可以在其中存儲任何內容,類似於緩存,但與緩存不同,它只會持續到下一個請求。爲了實現這一點,改變像這樣(只是舉例)操作方法:

[HttpPost] 
public ActionResult Index(OrderModel model) 
{ 
    dynamic existingItems = TempData["existing"]; 
    if (existingItems != null) 
    { 
     foreach (Employee empl in existingItems) 
      model.EmployeesList.Add(empl); 
    } 
    model.EmployeesList.Add(model.Employees); 
    TempData["existing"] = model.EmployeesList; 
    return View(model); 
} 
+0

我得到「System.NullReferenceException:對象引用未設置爲對象的實例。」 「model.EmployeesList.Add(model.Employees)」錯誤;「就像我以前一樣。我忘了在問題中提到這一點。 – holaq 2012-04-21 05:03:41

+0

@holaq,這是毫無疑問的,因爲回發後model.EmployeesList爲空。我更新了我的答案來創建它。 (雖然我不熟悉ICollection,但我不確定我的語法是否有效。) – McGarnagle 2012-04-21 05:13:32

+0

這是可行的,只有當您刷新頁面時,員工列表纔會消失。 – DMulligan 2012-04-21 05:47:06

相關問題