ASP.NET MVC 下拉列表数据不会插入
本文关键字:插入 数据 下拉列表 NET MVC ASP | 更新日期: 2023-09-27 17:56:16
>我有两个模型,我想在数据库中插入一行,并在 DropDownList 中填充外键关系。物料模型的数据插入没有问题,但制造商 ID 未插入(插入空)。我找不到为什么。更新:将项目上传到:http://mvcapplication2.codeplex.com/
<div class="editor-label">
@Html.LabelFor(model => model.ManufacturerID,"Manufacturer")
</div>
<div class="editor-field">
@Html.DropDownList("ManufacturerID",string.Empty)
@Html.ValidationMessageFor(model => model.ManufacturerID)
</div>
public class Item
{
public int ItemID { get; set; }
public string Serial { get; set; }
public string ItemName { get; set; }
public int? ManufacturerID { get; set; }
public Manufacturer Manufacturer { get; set; }
}
public class Manufacturer
{
public int ManufacturerID { get; set; }
public string ManufacturerName { get; set; }
public List<Item> Items { get; set; }
}
public ActionResult Create()
{
ViewBag.ManufacturerID = new SelectList(db.Manufacturers, "ManufacturerID", "ManufacturerName");
return View();
}
[HttpPost]
public ActionResult Create(Item ıtem)
{
if (ModelState.IsValid)
{
db.Items.Add(ıtem);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(ıtem);
}
我宁愿不要在视图中使用域模型。我会创建一些特定于视图的视图模型。此外,要从操作方法(例如:下拉列表)传输数据,我将使用强类型方法,而不是动态 viewbag/viewdata 方法。
创建视图模型类
public class CreateItemVM
{
public string SerialNumber { set;get;}
public int SelectedManufactureID { set;get;}
public List<SelectListItem> Manufacturers { set;get;}
public CreateItemVM()
{
Manufacturers =new List<SelectListItem>();
}
}
现在,在您的 GET 操作方法中,创建视图模型的对象,初始化相关值并发送到视图。
public ActionResult Create()
{
var vm=new CreateItemVM();
vm.Manufacturers=GetManufacturerList();
return View(vm);
}
private List<SelectListItem> GetManufacturerList()
{
List<SelectListItem> manuList=new List<SelectListItem>();
manuList=(from p in db.Manufacturers
select new SelectListItem {
Value=p.ID.ToString(),
Text=p.Name}
).ToList();
return manuList;
}
现在在我们的视图中,它被强类型化到我们的视图模型,
@model CreateItemVM
@using(Html.Beginform())
{
@Html.DropDownListfor(x=>x.SelectedManufactureID ,
Model.Manufacturers,"select")
<input type="submit" />
}
最后,在我们的 POST 操作方法中,我们将从已发布的视图模型中读取值,并将其分配为域对象的属性值并保存。 选定的制造商 ID 值将位于视图模型的 SelectedManufactureID
属性中。
[HttpPost]
public ActionResult Create(CreateItemVM model)
{
if(ModelState.IsValid)
{
Item domainObject=new Item();
domainObject.ManufacturerID =model.SelectedManufactureID ;
//set other relevant properties also
db.Items.Add(ıtem);
db.SaveChanges();
return RedirectToAction("Index");
}
// reload the dropdown before returning to the view
model.Manufacturers=GetManufacturerList();
return View(model);
}
尝试使关系更加明确,使属性虚拟并添加属性:
public class Item
{
...
[ForeignKey("Manufacturer")]
public int? ManufacturerID { get; set; }
public virtual Manufacturer Manufacturer { get; set; }
}
public class Manufacturer
{
...
public virtual List<Item> Items { get; set; }
}
编辑:
您可以使用更绑定的方式来构建下拉列表:
@Html.DropDownListfor(x=>x.SelectedManufactureID ,
ViewBag.ManufacturerID as SelectList,"Choose one")
编辑 2:
更好的方法是为视图创建一个特定的模型(称为 ViewModel)来表示数据并像@Shyju所说的那样构建视图。
发现问题。我发送到视图的 Viewbag 应该命名为 ManufacturerID,我正在发送制造商,尽管它填充了下拉列表,但不知何故