2015-07-03 80 views
0

我对MVC相当陌生,我试图摆脱使用WebForms的形式,但有些事情让我感到困惑,因为我需要完成某些工作。MVC绑定模型到视图中的下拉列表

在我看来,“/areas/admin/cars/form.cshtml”我想用@ Html.Dropdownfor,传递的这是由CarManufacturer.cs模型中定义我的汽车制造商的列表。我该怎么做?

我使用NHibernate的 - 不知道如果让任何不同...

模型;

public class CarManufacturer 
    { 
     public virtual int Id { get; set; } 
     public virtual string Manufacturer { get; set; } 
     //***do i need the below line?*** 
     public SelectList CarManufacturerList { get; set; } 
    } 

    public class CarManufacturerMap : ClassMapping<CarManufacturer> 
    { 
     public CarManufacturerMap() 
     { 
      Table("CarManufacturers"); 
      Id(x => x.Id, x => x.Generator(Generators.Identity)); 
      Property(x => x.Manufacturer, x => x.NotNullable(true)); 
     } 
    } 

的控制器调用形式是carController.cs

public ActionResult New() 
      { 
       //re-susing views for add and edit 
       return View("Form", new CarsForm 
       { 
        IsNew = true, 
       }); 
      } 

      public ActionResult Edit(int id) 
      { 
       var car = Database.Session.Load<Car>(id); 
       if (car == null) 
        return HttpNotFound(); 

       return View("Form", new CarsForm 
       { 
        ...do stuff here to populate form fields!... 
       }); 
      } 

视图模型;

public class CarsForm 
    { 
     //do I need the below line? 
     public IList<CarManufacturer> Manufacturers { get; set; } 

     public bool IsNew { get; set; }//whether add or edit action to be used 
     public int? CarId { get; set; } 
...more fields 
} 

非常感谢耐心和帮助新的MVC'er!

回答

0

我通常会将dropdownlist数据添加到viewbag。您可以从视图模型和实体类中删除列表。

你的控制器看起来像这样。

public ActionResult New() 
{ 
    ViewBag.Manufacturers = new SelectList(
     Database.Session.Load<Manufacturer>(), 
     "Manufacturer", 
     "Manufacturer"); 
    return View("Form", new CarsForm 
    { 
     IsNew = true, 
    }); 
} 

public ActionResult Edit(int id) 
{ 
    var car = Database.Session.Load<Car>(id); 
    if (car == null) 
     return HttpNotFound(); 

    ViewBag.Manufacturers = new SelectList(
     Database.Session.Load<Manufacturer>(), 
     "Manufacturer", 
     "Manufacturer", 
     car.Manufacturer); //sets the initial value 
    return View("Form", new CarsForm 
    { 
     ...do stuff here to populate form fields!... 
    }); 
} 

然后在你看来,你只要将你的@Html.DropDownListFor

@Html.DropDownListFor(model => model.Manufacturer, (SelectList)ViewBag.Manufacturers) 
+0

啊,现在我看看viewbag方法是如何工作的,我认为我更喜欢将模型传递到DDL,这是我遇到的问题! :) 谢谢! –

-1

这是一种方法,并且我个人更喜欢小型项目的方法,但有几种方法可以对这只特定的猫进行皮肤处理。

希望你会注意到,Html.DropDownListFor需要List<SelectListItem>这样你就可以继续前进,并宣布一个在您的视图模型,但你也需要特定制造商的Id选择:

public class CarsForm 
{ 
    public int ManufacturerId { get; set; } 
    public List<SelectListItem> Manufacturers { get; set; } 

    // Other properties 
} 

作为请注意,视图模型的命名约定为CreateCarViewModel

在你New的方法,你需要从你的数据库实例Manufacturers,通常它会是这样的:现在

viewModel.Manufacturers = (from m in dbContext.Manufacturers 
          orderby m.Name 
          select new SelectLisItem { Text = m.Name, Value = m.Id.ToString() }).ToList() 

,在你View,你可以这样做:

@Html.DropDownListFor(model => model.Manufacturers, Model.ManufacturerId, "Please select") 
+0

你可能会得到使用m.Id.ToString()一个错误,如果你直接从的DbContext – JamieD77

+0

选择@ user1221684我'不知道是这种情况,但很容易通过'ToList()'修复,然而 – ediblecode

+0

你也可以使用'SqlFunctions.StringConvert((double)m.Id)' – JamieD77