DropDownListFor值不能为null

时间:2017-04-06 19:03:49

标签: asp.net-mvc

我是MVC的新手。我选择公司时使用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);
}

ViewModel中的相关字段(来自Customer表)是:

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

创建ViewBag的Create方法中的代码:

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上得到一个错误“Value not not null”。我已经研究过有这个问题的其他人,但找不到适用于这种情况的答案。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

错误是因为在POST方法中返回视图(ModelState无效),但没有像在GET方法中那样设置ViewBag.Customers的值,所以它{{1并且您无法从null集合中创建SelectList

您需要像在null声明之前那样在GET方法中指定ViewBag.Customers

作为旁注,由于您使用的是视图模型,因此该视图模型应包含一个属性(例如)return View(qvm);,并在控制器方法和视图中设置该属性

public IEnumerable<SelectListItem> CustomerList { get; set; }

答案 1 :(得分:1)

在选择公司时,您是在制作完整的POST请求吗? 如果是,您需要填写 ViewBag.Customers ,因为ViewBag的生命周期。

http://www.dotnettricks.com/learn/mvc/viewdata-vs-viewbag-vs-tempdata-vs-session