2017-04-06 106 views
0

我是MVC的新手。我使用DropDownListFor来选择公司时填充许多Customer字段。我使用下面的代码为DropDownListFor:DropDownListFor的值不能为空

@Html.DropDownListFor(model => model.CustomerId, new SelectList(ViewBag.Customers, "CustomerId", "Company"), "---Select one---", new { htmlAttributes = new { @class = "company" } }); 
@Html.HiddenFor(model => model.Company) 

此代码检索客户数据:

[HttpPost] 
public ActionResult GetCustomer(int custId) 
{ 
    var data = db.Customers.Find(custId); 
    return Json(data); 
} 

在视图模型的相关领域(从客户表)有:

public int CustomerId { get; set; } 
public string Company { get; set; } 

Create方法中创建ViewBag的代码:

public ActionResult Create() 
{ 
    QuoteViewModel qvm = new QuoteViewModel(); 
    qvm.QuoteDetail = new List<QuoteDetail>(); 
    var customers = db.Customers.ToList(); 
    ViewBag.Customers = customers; 
    return View(qvm); 
} 

这里是为POST代码:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult Create(QuoteViewModel qvm) 
{ 
    if (ModelState.IsValid) 
    { 
     Quote quote1 = new Quote(); 
     quote1.CustomerId = qvm.CustomerId; 
     ... 
     db.Quotes.Add(quote1); 
     customer.CustomerId = qvm.CustomerId; 
     ... 
     db.Entry(customer).State = EntityState.Modified; 
     bool saveFailed; 
     do 
     { 
      saveFailed = false; 
      try 
      { 
       db.SaveChanges(); 
      } 
      catch (DbUpdateConcurrencyException ex) 
      { 
       saveFailed = true; 
       var objContext = ((IObjectContextAdapter)db).ObjectContext; 
       // Get failed entry 
       var entry = ex.Entries.Single(); 
       // Now call refresh on ObjectContext 
       objContext.Refresh(RefreshMode.ClientWins, entry.Entity); 
      } 
     } while (saveFailed); 
     return RedirectToAction("Index"); 
    } 
    return View(qvm); 
} 

领域的人口工作正常,但是当我试图创建视图模型我上DropDownListFor错误“值不能为空”。我研究过有这个问题的其他人,但找不到适用于此案例的答案。任何帮助将非常感激。

+0

这是发生在你提交了(你需要显示你的POST方法,用于Create()' –

+0

添加上面。谢谢Stephen。 –

回答

1

的错误是因为POST方法返回的视图(ModelState是无效的),但没有设置的ViewBag.Customers如您在GET方法没有价值,所以它null,你不能创建来自null集合的SelectList

您需要指定ViewBag.Customers,正如您在return View(qvm);声明之前的GET方法中所做的那样。

作为一个方面说明,既然你使用视图模式,该视图模式应该包含一个属性(比如说)public IEnumerable<SelectListItem> CustomerList { get; set; }和设置,在控制方法,并在视图

@Html.DropDownListFor(model => model.CustomerId, Model.CustomerList, "---Select one---", new { @class = "company" }); 
+0

我添加了ViewBag.Customers到POST。现在我得到一个验证错误“Company name is required”,即使公司名称已在DropDownListFor中被选中。 –

+0

这是一个完全独立的问题,您并未显示与此相关的相关代码(另请参阅我在第电子聊天室 - 你没有任何意义,你有一个财产'字符串公司') –