这是我用来绑定下拉列表的代码,razor在末尾期望;
,如下所述
@{
ViewBag.test = Model.Sample.Select(o => new SelectListItem
{
Text = o.Name,
Value = o.sampleId.ToString()
}
);
}
但当下拉菜单被渲染时,我在UI 中的下拉菜单旁边会得到;
如果我删除分号,就会出现黄屏编译错误
我做错什么了吗?
您没有在此代码段中呈现任何下拉列表。您所要做的就是为ViewBag.test
分配一个值,是的,末尾应该有一个;
,这样它才是有效的C#代码:
@{
ViewBag.test = Model.Sample.Select(o => new SelectListItem
{
Value = o.sampleId.ToString(),
Text = o.Name,
});
}
您应该做的是删除可能在@Html.DropDownList
助手调用之后留下的;
。
还要记住,在视图中设置ViewBag
值是不好的做法。使用ViewBag
是不好的做法,但那是另一回事(见下文)。应该在呈现视图的控制器操作中指定该值。获取数据不是视图的责任。视图的职责是以强类型视图模型的形式显示发送给它的数据,该模型是在控制器操作中创建的。
综上所述:
您首先要编写一个视图模型:
public class MyViewModel
{
public string SelectedValue { get; set; }
public IEnumerable<SelectListItem> Items { get; set; }
}
则控制器动作填充并将该视图模型传递给视图:
public ActionResult SomeAction()
{
IEnumerable<SomeDomainModel> data = ... hit your DAL to retrieve the model
// Now build a view model
var model = new MyViewModel();
model.Items = data.Select(o => new SelectListItem
{
Value = o.sampleId.ToString(),
Text = o.Name,
});
// pass the view model to the view
return View(model);
}
最后,您有了一个与您之前设计的视图模型相对应的强类型视图:
@model MyViewModel
...
@Html.DropDownListFor(x => x.SelectedValue, Model.Items)