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