1

我想绑定@Html.DropDownListForModel数据而不使用Viewbag并查看网络上的许多不同示例。但其中大多数使用Viewbag或扩展方法,我想要一个更好的方法来解决这个问题。我尝试以下方法,但它似乎并没有工作:在ASP.NET MVC5中绑定@ Html.DropDownListFor的最佳方法是什么?

@Html.DropDownListFor(m => m.LabId, new SelectList(Model.Lab, "Id", "Name"), 
    "---- Select----", new { @class = "selectpicker" }) 

是否可以直接绑定从型号@Html.DropDownListFor不使用Viewbag或在ASP.NET MVC5Controller任何额外的方法?你能举一些例子来表现这一点吗?

+0

'ViewBag'只是一个容器 - 传递任何你需要的数据作为强类型的'@ model' – Jasen

回答

2

不使用动态类的东西ViewBag

您可以将新属性添加到您的视图模型 IEnumrable<SelectListItem>类型的选择选项的强类型的视图模型方法。

视图模型是一个简单的POCO类,用于在视图到动作方法之间传输数据,反之亦然。它们是特定于观点的。添加仅用于视图的属性。

public class CreateUserVm 
{ 
    public IEnumrable<SelectListItem> Labs { set;get;} 
    public int SelectedLabId { set;get;} 
    //Add other properties as needed for the view 
} 

,并在你的GET操作,创建这个视图模型的对象,加载实验室财产和发送到视图。

public ActionResult Create() 
{ 
    var vm= new CreateUserVm(); 
    // Hard coded for demo. You can replace with real data from db 
    vm.Labs = new List<SelectListItem> { 
    new SelectListItem { Value="1", Text="One" }, 
    new SelectListItem { Value ="2", Text="Two" } 
    }; 
    return View(vm); 
} 

,并在其中强类型此视图模型视图,调用DropDownListFor助手方法

@model CreateUserVm 
@Html.DropDownListFor(f=>f.SelectedLabId, Model.Labs,"Select one") 

预先选择的下拉选项

如果你喜欢当剃须刀呈现页面时预先选择一个选项,您可以将您的视图模型的SelectedLabId属性值设置为选项项目(SelectListItem)的value属性值。

public ActionResult Create() 
{ 
    var vm= new CreateUserVm(); 
    // Hard coded for demo. You can replace with real data from db 
    vm.Labs = new List<SelectListItem> { 
    new SelectListItem { Value="1", Text="SugarLab" }, 
    new SelectListItem { Value ="2", Text="CandyLab" }, 
    new SelectListItem { Value ="3", Text="SodaLab" } 
    }; 
    vm.SelectedLabId = 2; // Will set "CandyLab" option as selected 
    return View(vm); 
} 

如果你要使用真实数据,而不是硬编码的2项,你可以做到这一点

vm.Labs = dbContext.Labs.Select(x=>new SelectListItem { Value=x.Id.ToString(), 
                 Text= x.Name }).ToList(); 

假设dbContext是你的DbContext类对象,它有DbSet<Lab>Labs财产每个Lab实体都有一个Id和Name属性。

+0

非常感谢您的详细解释和答案。我认为这是填充Dropdownlist最简单的方法。 –

+0

当涉及到DropDownListFor时,默认值和选定值之间有很好的区别,我会争辩说,您预先选择值的方法并不完全正确 - 您最好使用DropDownListFor参数之一而不是设置它在模型上。我在这个问题上写了一篇短文 - http://nimblegecko.com/how-to-set-default-selected-value-on-drop-down-list-from-database/ – Art

0

通过在模型中添加列表项,您正处于良好的轨道。我不知道你是如何在你的代码中实现它的。

模型类中的Lab属性应该是IEnumerable,List或您想要的集合。然后在你的剃须刀视图中,外观很好。

也许你忘记了在发送到视图之前从控制器中的action方法初始化列表。 E.G:

var model = new ViewModel{ 

Labs = repository.GetLabs(); 
} 

上述,我认为库应该是能够访问或获取所需数据的手段,也是对Labs属性定义为在ViewModel类IEnumerable<Lab> Labs

所有应该工作。也许你应该清楚你所得到的错误。

相关问题