Asp.net mvc 3 MVC3 DropDownList用于不填充selectedValue

Asp.net mvc 3 MVC3 DropDownList用于不填充selectedValue,asp.net-mvc-3,razor,Asp.net Mvc 3,Razor,我觉得我在吃疯狂的药片。我有一个下拉列表,可以从我们的数据库中读取我们所有的葡萄酒生产商。我想将selectedValue设置为引用页面驱动的特定ID。我可以看到它在调试中拾取selectedValue,我看到已填充的selectedValue(本例为906),但在呈现页面时,它没有将dropdownlist设置为正确的值,默认值始终默认为1。我试着在razor中创建selectList而不是我的控制器,但没有任何效果。在这方面的任何帮助都将不胜感激,我猜这是一件小事 控制器:

我觉得我在吃疯狂的药片。我有一个下拉列表,可以从我们的数据库中读取我们所有的葡萄酒生产商。我想将selectedValue设置为引用页面驱动的特定ID。我可以看到它在调试中拾取selectedValue,我看到已填充的selectedValue(本例为906),但在呈现页面时,它没有将dropdownlist设置为正确的值,默认值始终默认为1。我试着在razor中创建selectList而不是我的控制器,但没有任何效果。在这方面的任何帮助都将不胜感激,我猜这是一件小事

控制器:

        if (User.IsInRole("admin"))
        {
            if (ID != 0)
            {
                ViewBag.ProducerSelect = new SelectList(db.Producers.OrderBy(p => p.Name), "ProducerID", "Name", ID);
            }
            else
            {
                ViewBag.ProducerSelect = new SelectList(db.Producers.OrderBy(p => p.Name), "ProducerID", "Name");
            }
        }
视图:


用户创建一个ViewModel ex WineViewModel

public class WineViewModel
    {

        public Wine Wine { get; set; }

        public SelectList PProducerList { get; set; }

        public WineViewModel() { }

        public WineViewModel(Wine wine) 
        {
            this.Wine = wine;          

        }
    }
在控制器中尝试以下操作 var模型=新的WineViewModel(选择Wine)

请注意,我是如何在SelectList中以独占方式声明哪个是ID,哪个是值的

那么在你看来呢

     @Html.DropDownListFor(model => model.Wine.ProducerID, Model.ProjectTypeList)

如果要预选项目,请将该值设置为ProducerId属性

var yourViewModelObj=new YourViewModel;
yourViewModelObj.Wine.ProducerId=906; //or whatever value you want
return View(yourViewModelObj);
建议:为提高代码可读性/维护性,请尽量避免使用ViewBag/ViewData,并使用ViewModel传递数据

我会在ViewModel中添加一个属性来保存生产者集合

public class WineViewModel
{
   //Other Existing properties also
   public IEnumerable<SelectListItem> Producers{ get; set; }
   public string SelectedProducer { get; set; }
}
在您的强类型视图中

@Html.DropDownListFor(x => x.SelectedProducer, 
     new SelectList(Model.Producers, "Value", "Text"), "Select Producer")

由上述代码生成的HTML标记将具有HTML select,其值为2的选项将被选中。

。我把ViewModel.wine.ProducerID放在页面的其他地方的一个隐藏字段中,默认值为1,所以我只是将其分配给传入的值,效果非常好。我知道是这样的。谢谢

我会试试看,但是viewbag能用吗?我只是用ViewModel的属性替换viewbag,对吗?您也可以使用viewbag。但始终建议使用ViewModel传递数据。您可以执行ViewBag.ProjectTypeList=new SelectList(从db.Producers orderby p.Name中的p选择新的{p.ID,p.Name},“ID”,“Name”)注意,我是如何专门声明哪个是ID,哪个是值啊!隐藏字段总是令人讨厌!!很高兴知道最后都解决了。别忘了投票选出你认为有用的答案
var yourViewModelObj=new YourViewModel;
yourViewModelObj.Wine.ProducerId=906; //or whatever value you want
return View(yourViewModelObj);
public class WineViewModel
{
   //Other Existing properties also
   public IEnumerable<SelectListItem> Producers{ get; set; }
   public string SelectedProducer { get; set; }
}
public ActionResult CreateWine()
{
  var vm=new WineViewModel();
  //The below code is hardcoded for demo. you mat replace with DB data.
  vm.Producers= new[]
  {
    new SelectListItem { Value = "1", Text = "Prodcer A" },
    new SelectListItem { Value = "2", Text = "Prodcer B" },
    new SelectListItem { Value = "3", Text = "Prodcer C" }
  };      
  //Now let's set the default one's value
  vm.SelectedProducer = "2";  

  return View(vm);    
}
@Html.DropDownListFor(x => x.SelectedProducer, 
     new SelectList(Model.Producers, "Value", "Text"), "Select Producer")