在 ASP.NET MVC (Razor) 项目中,我在编辑视图中使用带有多选选项的 ListBox,在使用 in 突出显示先前选择的项目时出现问题selectedValues
,MultiSelectList
所以我之前问了一个关于 SO的问题。根据对该问题给出的答案,我决定使用 ViewModel(带有 AutoMapper)将数据传递给视图,而不使用ViewBag
,但我仍然有同样的问题。它没有选择selectedValues
列表中给出的项目
这是我的新代码
楷模
public class Post
{
public int Id { get; set; }
...
public string Tags { get; set; }
}
public class PostEditViewModel
{
private DocLibraryContext db = new DocLibraryContext();
public int Id { get; set; }
..
public MultiSelectList TagsList { get; set; }
}
控制器
public ActionResult Edit(int id)
{
Post post = db.Posts.Find(id);
PostEditViewModel postEditViewModel = Mapper.Map<Post, PostEditViewModel>(post);
var tagsQuery = from d in db.Tags
orderby d.Name
select d;
postEditViewModel.TagsList = new MultiSelectList(tagsQuery, "Id", "Name", post.Tags.Split(','));
return View(postEditViewModel);
}
看法
<div class="editor-field">
@Html.ListBoxFor(model => model.Tags, Model.TagsList as MultiSelectList)
</div>
我在这里做错了什么?请帮忙....
更新 1:
将控制器更改为
public ActionResult Edit(int id)
{
Post post = db.Posts.Find(id);
PostEditViewModel postEditViewModel = Mapper.Map<Post, PostEditViewModel>(post);
var tagsQuery = from d in db.Tags
orderby d.Name
select d;
var selectedIds = post.Tags.Split(',').Select(n => tagsQuery.First(t => t.Name == n));
postEditViewModel.TagsList = new MultiSelectList(tagsQuery, "Id", "Name", selectedIds);
return View(postEditViewModel);
}
但我得到相同的结果。
更新 2:
我尝试更改代码(如本教程中所述),它有效,但我需要使用以前的方法..
楷模
public Post Post { get; set; }
public MultiSelectList TagsList { get; set; }
public PostEditViewModel(Post post)
{
Post = post;
var tagsQuery = from d in db.Tags
orderby d.Name
select d;
TagsList = new MultiSelectList(tagsQuery, "Name", "Name", post.Tags.Split(','));
}
控制器
public ActionResult Edit(int id)
{
Post post = db.Posts.Find(id);
return View(new PostEditViewModel(post));
}
看法
<div class="editor-field">
@Html.ListBox("Tags", Model.TagsList as MultiSelectList)
</div>
有什么区别……??