2015-03-31 63 views
1

我想知道當你建立一個表插入到數據庫時,通過視圖傳遞數據的推薦最佳實踐是什麼?MVC通過視圖移動數據

因此,例如,如果您有一個員工網絡應用程序,在該應用程序的第一頁輸入新員工的詳細信息,第一個和第二個名稱。第二頁輸入部門詳情。

您可以使用兩種不同的模式這個審定等

所以,當你更新的名稱型號,並重定向到第二頁視圖,你怎麼可以傳遞數據有,儲存以更新系數據,然後更新組合模型並傳遞給第三個視圖以輸入第三個視圖的聯繫詳細信息。

我可以通過傳遞viewbag數據來看到它,但這看起來很糟糕。我所擁有的問題是隻能夠爲每個視圖引用一個模型,所以它似乎會丟失以前的數據。

namespace Next.Controllers 
{ 
    public class NextController : Controller 
    { 
     // GET: Next 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult NewEmpFirst() 
     { 
      return View(); 
     } 

     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult NewEmpFirst([Bind(Include = "ID, Forename, Surname")] First NewEmpFirst) 
     { 
      if (ModelState.IsValid) 
      { 
       First first = new First 
       { 
        ID = 1, 
        Forename = NewEmpFirst.Forename, 
        Surname = NewEmpFirst.Surname 
       }; 
      } 

      TempData["first"] = NewEmpFirst; 
      return RedirectToAction("NewEmpSecond"); 
     } 

     public ActionResult NewEmpSecond() 
     { 
      First first = TempData["first"] as First; 
      TempData["first"] = first; 
      ViewBag.Forename = first.Forename; 


      return View(); 
     } 


     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult NewEmpSecond([Bind(Include = "ID, Department")] Second NewEmpSecond) 
     { 
      if (ModelState.IsValid) 
      { 
       First first = TempData["first"] as First; 

       FirstSecond fs = new FirstSecond 
       { 
        ID = 1, 
        Forename = first.Forename, 
        Surname = first.Surname, 
        Department = "hello" 
       }; 
      } 

      TempData["fs"] = NewEmpSecond; 
      return RedirectToAction("NewEmpThird"); 
     } 

     public ActionResult NewEmpThird() 
     { 
      FirstSecond fs = TempData["fs"] as FirstSecond; 

      return View(fs); 
     } 

    } 
} 

我到目前爲止。數據將從一個視圖傳遞到另一個視圖,但是當我引用不同的模型來插入數據時,它似乎會清空以前的一組數據。

回答

2

使用會話變量。更好的是,您可以創建一個類,該類將擁有您需要收集的所有屬性,並將該類的實例保存爲會話變量。一旦到達流程的最後一步,請獲取已保存的實例並將其保存到數據庫中。

即類存儲值可能看起來像這樣:

public class MySessionValues 
{ 
    public First Employee; 
    public Second Department; 

    // other steps here ... 
} 

然後在您的控制器動作NewEmpFirst使用它,而不是Temp

var sessionValues = new MySessionValues(); 
sessionValues.Employee = first; 
Session["MySessionValues"] = sessionValues; 

在後面的步驟獲取已保存的實例,並添加新值:

var sessionValues = Session["MySessionValues"] as MySessionValues; 
sessionValues.Second = NewEmpSecond; // or any other value you're saving 
Session["MySessionValues"] = sessionValues; 

您會看到模式RN。您也可以在MySessionValues類上創建方法,以幫助存儲和檢索Session範圍內的實例。

您可以將類在App_Code文件夾中的文件,如果你想,或者在您的應用程序(同一水平Controllers文件夾)的根目錄中創建文件夾Helpers。但是,如果您只在該控制器中使用此類,則可以將代碼放入與控制器相同的文件中。

+0

通過創建一個班級,你的意思是在一個班級中有ID,姓,名和部門,並且在一個班級和部門中添加姓和名? 如果這樣,將無法正常工作,因爲我想驗證其中的一些作爲必填字段。 – JQuery 2015-03-31 14:23:40

+0

更新了一些示例代碼。 – Floremin 2015-03-31 14:46:04

+0

謝謝,我現在就試試這個。 編輯 哪裏最好創建這個類,在Controllers文件夾或App_Code中?有沒有推薦的公約? – JQuery 2015-03-31 14:57:09