重要提示:我已编辑问题以反映 Jannagy02 的答案,从而消除了 Dropdownlist 问题
我有一个关于 ASP.NET MVC 4 和实体框架的概念性问题。
首先,让我们看看我的模型:
这所有广告都在一台设备上。一个设备有一个类别、一个制造商、一个状态和 0..n 条评论。这是被剥离的。在学习 MVC 时,我不想过于复杂。因此,让我们只关注Device
并 Category
忽略诸如存储库和工作单元模式之类的东西。
在我设置好之后,脚手架发挥了作用,生成的视图只显示了Name
设备的属性。
我的计划是,在创建或更新设备时,用户(不是管理员)只能从已经存在的类别中进行选择。因此是一个下拉列表。
为此,我创建了一个 ViewModel:
public class DeviceEditViewModel
{
public Device dev { get; set; }
public int? SelectedManufactor { set; get; }
public IEnumerable<SelectListItem> Manufactors { get; set; }
public int? SelectedCategory { set; get; }
public IEnumerable<SelectListItem> CategoriesListItems { get; set; }
}
GET 编辑方法如下所示:
public ActionResult Edit(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var device = db.Devices.Find(id);
var vm = new DeviceEditViewModel
{
dev = device,
Categories = db.Categories.ToList().Select(x => new SelectListItem
{
Value = x.ID.ToString(),
Text = x.Name,
Selected = x == device.Category
})
};
return View(vm);
}
这是我的第一个问题:生成的下拉列表没有获取设备的实际类别。那么我该如何选择实际类别作为选定值呢?
其次,当我点击保存按钮时,如何将这个选定的 ListItem 作为设备模型的类别注入,这如何反映在 post 方法中,如下所示:
//Edited to reflect answer
public ActionResult Edit(DeviceEditViewModel editViewModel)
{
if (ModelState.IsValid)
{
Device device = editViewModel.dev;
if (editViewModel.SelectedCategory != null)
{
Category selectedCat = db.Categories.Single(x => x.ID == editViewModel.SelectedCategory.Value);
device.Category = selectedCat;
}
db.Entry(device).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(editViewModel);
}
这是我的观点的 DropDownList 部分:
<div class="control-group">
@Html.LabelFor(model => model.dev.Category, new { @class = "control-label" })
<div class="controls">
@Html.DropDownListFor(x => x.CategoriesListItems, Model.CategoriesListItems)
@Html.ValidationMessageFor(model => model.dev.Category, null, new { @class = "help-inline" })
</div>
</div>
剩下的问题在于 POST 方法。我已经写了更长的时间以便能够更好地调试它。实际问题是:
设备使用类别更新,但在db.SaveChanges()
调用之后它不会被写入数据库。