在ASP.NET MVC(Razor)项目中,我在编辑视图中使用带有“多选”选项的ListBox
,
CONTROLLER
public ActionResult Edit(int id)
{
Post post = db.Posts.Find(id);
string selectedValues = post.Tags; //This contains Selected values list (Eg: "AA,BB")
ViewBag.Tagslist = GetTags(selectedValues.Split(','));
return View(post);
}
private MultiSelectList GetTags(string[] selectedValues)
{
var tagsQuery = from d in db.Tags
orderby d.Name
select d;
return new MultiSelectList(tagsQuery, "Name", "Name", selectedValues);
}
HTML
<div class="editor-field">
@Html.ListBox("Tags", ViewBag.Tagslist as MultiSelectList)
</div>
这会将项目(标记列表)加载到ListBox
,但不会突出显示Selected Values
列表中的项目。
如何解决此问题?
提前致谢。
答案 0 :(得分:2)
我怀疑您的Post
类(您的视图是强类型的)有一个名为Tags
的属性。您还可以使用Tags
作为ListBox
助手的第一个参数。这意味着帮助程序将首先查看此属性,并忽略您传递给MultiSelectList
的选定值。因此,设置所选值的正确方法如下:
public ActionResult Edit(int id)
{
Post post = db.Posts.Find(id);
ViewBag.Tagslist = GetTags();
return View(post);
}
private MultiSelectList GetTags()
{
var tagsQuery = from d in db.Tags
orderby d.Name
select d;
return new MultiSelectList(tagsQuery, "Name", "Name");
}
并在视图中:
<div class="editor-field">
@Html.ListBoxFor(x => x.Tags, ViewBag.Tagslist as MultiSelectList)
</div>
这是一个完整的例子,应该说明:
public class HomeController : Controller
{
public ActionResult Index()
{
var post = new Post
{
Tags = new[] { "AA", "BB" }
};
var allTags = new[]
{
new { Name = "AA" }, new { Name = "BB" }, new { Name = "CC" },
};
ViewBag.Tagslist = new MultiSelectList(allTags, "Name", "Name");
return View(post);
}
}
另外,我建议您使用视图模型,而不是将域实体传递给视图。因此,在您的PostViewModel
中,您将拥有一个名为AllTags
的{{1}}类型的属性。通过这种方式,您将能够摆脱弱类型MultiSelectList
。