【问题标题】:DropDownListFor value cannot be nullDropDownListFor 值不能为空
【发布时间】:2017-04-06 19:03:49
【问题描述】:

我是 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 上收到错误“值不能为空”。我研究了其他有此问题的人,但找不到适用于此案例的答案。任何帮助将不胜感激。

【问题讨论】:

  • 提交时是否会出现这种情况(需要显示Create()的POST方法
  • 添加在上面。谢谢斯蒂芬。

标签: asp.net-mvc


【解决方案1】:

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

您需要分配ViewBag.Customers,就像您在return View(qvm); 语句之前在GET 方法中所做的那样。

附带说明,由于您使用视图模型,该视图模型应该包含一个属性(例如)public IEnumerable&lt;SelectListItem&gt; CustomerList { get; set; },并且您在控制器方法和视图中设置它

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

【讨论】:

  • 我将 ViewBag.Customers 添加到 POST。现在,即使在 DropDownListFor 中选择了公司名称,我也会收到验证错误“需要公司名称”。
  • 这是一个完全独立的问题,您没有显示与此相关的代码(另请参阅我在聊天室中的评论 - 您拥有 string Company 的属性是没有意义的)跨度>
【解决方案2】:

您是否在选择公司时发出整页 POST 请求? 如果是,则需要填写 ViewBag.Customers,因为 ViewBag 的生命周期。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多