ASP.NET MVC下拉列表数据不会插入

时间:2013-01-25 20:47:19

标签: c# asp.net-mvc

我有两个模型,我想在数据库中插入一行,并在DropDownList中填充外键关系。 Item模型的数据插入没有问题,但没有插入ManufacturerID(它插入null)。我找不到原因。 更新:将项目上传到: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);
}

3 个答案:

答案 0 :(得分:3)

我宁愿不在视图中使用域模型。我会创建一些特定于视图的视图模型。此外,要从操作方法(例如:下拉列表)传输数据,我将使用强类型方法,而不是动态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操作方法中,创建viewmodel的对象,初始化相关值并发送到视图。

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;
}

现在在我们的视图中,它是我们的Viewmodel的强类型,

@model CreateItemVM
@using(Html.Beginform())
{
  @Html.DropDownListfor(x=>x.SelectedManufactureID ,
                                      Model.Manufacturers,"select")
  <input type="submit" />
}

最后在我们的POST动作方法中,我们将从发布的viewmodel读取值并将其指定为域对象的属性值并保存。选定的制造商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);   
}

答案 1 :(得分:1)

尝试使关系更加明确,使属性成为虚拟并添加属性:

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所说的视图。

答案 2 :(得分:0)

发现问题。我发送到视图的Viewbag应该被命名为ManufacturerID,我发送的是制造商,虽然它填充了下拉列表但它不知道它是不匹配的。