2016-04-27 23 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。 –