MultiSelectList不会突出显示以前选择的项目

时间:2012-06-18 04:47:27

标签: asp.net-mvc-3 razor listbox

在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列表中的项目。

如何解决此问题?

提前致谢。

1 个答案:

答案 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