【发布时间】:2012-06-22 07:41:27
【问题描述】:
在 ASP.NET MVC (Razor) 项目中,我在编辑视图中使用带有多选选项的 ListBox,在 MultiSelectList 中使用 selectedValues 突出显示先前选择的项目时出现问题,所以我之前问过question on SO。根据对该问题给出的答案,我决定使用 ViewModel(带有 AutoMapper)将数据传递给 View,而不使用 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:
我尝试更改代码(如this 教程),效果很好,但我需要使用以前的方法..
模型
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>
有什么不同...??
【问题讨论】:
标签: asp.net-mvc-3 razor listbox viewmodel