2016-04-27 14 views
0

我試圖創建一個下拉列表,讓你指定一個員工工作的公司。以下是我的EmployeeViewModel。 CompanyId是連接到公司表的外鍵約束數據庫字段。僱員控制器的下拉列表值似乎沒有進入MVC的數據庫5

public class EmployeeViewModel 
{ 
    public EmployeeViewModel() 
    { 

    } 

    public EmployeeViewModel(Employee Employee, string CompanyName) 
    { 
     Initialize(Employee, CompanyName); 
    } 

    public EmployeeViewModel(Employee Employee, CliFFEntities db) 
    { 
     Initialize(Employee, db.Companies.Find(Employee.CompanyId).Name); 
    } 

    private void Initialize(Employee employee, string CompanyName) 
    { 
     this.Id = employee.Id; 
     this.Name = employee.Name; 
     this.CompanyId = employee.CompanyId; 
     this.InternalId = employee.InternalId; 
     this.CompanyName = CompanyName; 
    } 


    public int Id { get; set; } 
    public string Name { get; set; } 
    public Nullable<int> InternalId { get; set; } 

    [Display(Name = "Company")] 
    public int CompanyId { get; set; } 

    public String CompanyName { get; set; } 

    //public List<Company> CompanyList { get; set; } 
    public IEnumerable<SelectListItem> CompanyList { get; set; } //to be set in controller on an as-needed basis 
} 

相關部分:

// GET: Employees/Create 
    public ActionResult Create() 
    { 
     var evm = new EmployeeViewModel(); 
     evm.CompanyList = new SelectList(db.Companies, "Id", "Name"); 
     return View(evm); 
    } 

我創建視圖的有關部分:

<div class="form-group"> 
     @Html.LabelFor(m => m.CompanyId) 
     <div class="col-md-10"> 
      @Html.DropDownListFor(m => m.CompanyId, Model.CompanyList) 
      @Html.ValidationMessageFor(m => m.CompanyId) 
     </div> 
    </div> 

所以一切似乎很好地工作。事實上,當我查看發佈數據時,它甚至將CompanyI設置爲正確的值,對應於數據庫中的公司ID。

但是,如果我強制數據庫端的外鍵,它會引發錯誤,因爲該公司ID似乎並沒有進入員工記錄。如果我關閉FK約束,則CompanyId只顯示爲0.

什麼給出了?

+1

我們可以看到您的POST方法嗎? –

+0

您如何將視圖模型映射到數據模型?你如何保存你的數據模型?你需要顯示你的POST方法 –

+0

謝謝,史蒂夫。顯然,我沒有注意到POST方法。我對MVC超級新手!我已經發布了一個回答我自己的問題。 –

回答

0

Welp,看起來像我是如此新的MVC 5,我沒有意識到有這樣的事情作爲post方法。以下是我將其更改爲將EmployeeViewModel映射回員工的原因:

// POST: Employees/Create 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "Id,Name,CompanyId,InternalId")] EmployeeViewModel evm) 
    { 
     var employee = new Employee { Name = evm.Name, CompanyId = evm.CompanyId, InternalId = evm.InternalId }; 
     if (ModelState.IsValid) 
     { 
      db.Employees.Add(employee); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(employee); 
    } 
+0

刪除糟糕的'BindAttribute'(你在使用視圖模型時從不需要這個)。它需要'返回View(evm);'如果'ModelState'無效。如果您返回視圖,則需要重新分配視圖模型'SelectList'屬性,否則您將拋出異常 –

+0

感謝您的反饋,@StephenMuecke。 –