0

在 ASP.NET MVC (Razor) 项目中,我ListBox在编辑视图中使用了多选选项,

控制器

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

如何解决这个问题?

提前致谢。

4

1 回答 1

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你将有一个名为AllTagstype的属性MultiSelectList。这样你就可以摆脱弱类型ViewBag

于 2012-06-18T06:00:11.173 回答