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