-1

我多次阅读 MVC 专家说如果我要使用 SelectList,最好IEnumerable<SelectList>在我的模型中定义一个。
例如,在这个问题中。
考虑这个简单的例子:

public class Car()
{
    public string MyBrand { get; set; }
    public IEnumerable<SelectListItem> CarBrands { get; set; } // Sorry, mistyped, it shoudl be SelectListItem rather than CarBrand
}

在 Controller 中,人们会这样做:

public ActionResult Index() 
{
    var c = new Car
    {
        CarBrands = new List<CarBrand>
        {
            // And here goes all the options..
        }
    }
    return View(c);
}

但是,从Pro ASP.NET MVC中,我学到了这种创建新实例的方法。

public ActionResult Create() // Get
{
    return View()
}
[HttpPost]
public ActionResult Create(Car c)
{
    if(ModelState.IsValid) // Then add it to database
}

我的问题是:我应该如何将视图传递SelectList给视图?由于在 Get 方法中不存在模型,因此我似乎无法做到这一点。
我当然可以使用ViewBag,但我被告知要避免使用ViewBag,因为它会导致问题。我想知道我的选择是什么。

4

2 回答 2

1

您可以创建一个 ViewModel,其中包含您想要在表单上的所有 Car 属性,然后使您的 SelectList 成为该 ViewModel 类的属性

public class AddCarViewModel
{
   public int CarName { get; set; }
   public string CarModel { get; set; }
   ... etc

   public SelectList MyList
   {
      get;
      set;
   }
}

你的控制器看起来像

public ActionResult Create() // Get
{
    AddCarViewModel model = new AddCarViewModel();
    return View(model)
}

[HttpPost]
public ActionResult Create(AddCarViewModel c)
{
    if(ModelState.IsValid) // Then add it to database
}

标记

@Html.DropDownListFor(@model => model.ListProperty, Model.MyList, ....)
于 2013-07-17T15:36:37.447 回答
1

简单的方法,这是我没有模型的代码的副本

控制器中

ViewBag.poste_id = new SelectList(db.Postes, "Id", "designation");

视图中

@Html.DropDownList("poste_id", null," -- ", htmlAttributes: new { @class = "form-control" })
于 2019-04-16T08:12:05.257 回答