2013-03-28 54 views
0

我正在學習MVC4 + EF 5.0項目,我使用VS2012默認模板創建空白項目並搭建數據庫到* .edmx模型,並使用編輯視圖編輯工作人員工作在哪家公司。ASP.NET MVC,保持動態selectList的正確方法?

我遇到一個問題,就是當用戶輸入失敗並返回時,在編輯視圖(下拉菜單)中維護SelectList。

DropDownList控件從控制器綁定列表項:

Edit.cshtml

@Html.DropDownListFor(model => model.CompanyID, (SelectList)ViewData["CompanySelectList"]) 

MemberController.cs

[HttpGet] 
public ActionResult Edit(int SelectedCompanyID = 0, int StaffID = 0) 
{ 
    IQueryable<company_benefit> companys = from c in db.company where c.ID.Equals(CompanyID) select c ; 
    ViewData["CompanySelectList"] = new SelectList(companys, "ID", "Name", SelectedCompanyID); 

    staff s = db.staff.Find(StaffID); 
    if (s == null) 
    { 
     return HttpNotFound(); 
    } 
    return View(s); 
} 


    [HttpPost] 
    public ActionResult Edit(staff s) 
    { 
     if (ModelState.IsValid) 
     { 
      db.Entry(s).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); //Edit Success 
     } 

     return View(s); //Edit Fail 
    } 

如果有人提交具有無效數據產生的失效形式輸入,它會返回視圖。 但是,SelectList是從ViewData綁定的,因此當頁面加載時ViewData將消失,並且它是viewdata的行爲,並且我更改爲TempData也無濟於事。

所以當Post to Edit Action發佈時,我需要再次構建SelectList嗎?

我關注使用session來存儲那個,但是打破了MVC設計模式。

我的英文不好,抱歉讓人混淆。 謝謝。

回答

1

一個快速的解決方案是在你的HTTP POST方法爲編輯再次創建視圖的數據

[HttpPost] 
public ActionResult Edit(staff s) 
{ 
    if (ModelState.IsValid) 
    { 
     db.Entry(s).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); //Edit Success 
    } 
    IQueryable<company_benefit> companys = from c in db.company where c.ID.Equals(CompanyID) select c ; 
    ViewData["CompanySelectList"] = new SelectList(companys, "ID", "Name", SelectedCompanyID); 


    return View(s); //Edit Fail 
} 

你在做什麼基本上是說,當你從你的編輯視圖返回到服務器,然後服務器應該重建視圖數據並調用相同的視圖,以便它可以填充列表。

有一個更好的方法,您可以創建一個模型,其中包括您當前的模型和list<companys> companies = new list<companys>();,然後從數據庫再次填充它。這個概念再一次使用強類型模型。

+0

感謝您的回答,但它是否打破了ASP.NET MVC機制或概念? – Cheung 2013-03-28 02:30:53

+0

,因爲從數據庫再次填充它似乎很重複的任務。 – Cheung 2013-03-28 02:43:25

+0

您可以在視圖模型的構造函數中定義列表的總體,並且不要在實際編輯或後編輯視圖中重複它。 – 2013-03-28 04:03:44