我正在为我拥有的一个集合编写一个增强的搜索功能,但我遇到了一个问题。我正在尝试将列表存储在表单的隐藏字段中,以便每次用户发布表单时都可以添加到其中。
这是我的控制器代码:
public ActionResult Index(Int32 page = 0, List<String> filters = null, String filter = "", Int32 pageSize = 10, Boolean sortAscending = true, String sortBy = "Title") {
UserContext uc = SecurityHelpers.GetUserData();
LinkedList<SongViewModel> svm = new LinkedList<SongViewModel>();
var songs = _songRepository.FindAll()
.Where(a => a.Title.Contains(filter) ||
a.Lyrics.Contains(filter) ||
a.Description.Contains(filter));
ViewBag.ResultsCount = songs.Count();
ViewBag.Page = page;
ViewBag.PageSize = pageSize;
ViewBag.SortAscending = sortAscending;
if (filters == null) {
filters = new List<String>();
}
filters.Add(filter);
ViewBag.Filters = new JavaScriptSerializer().Serialize(filters);
songs = songs.Sort(sortBy, sortAscending)
.Skip(page * pageSize)
.Take(pageSize);
foreach (Song s in songs) {
((LinkedList<SongViewModel>)svm).AddLast(new SongViewModel(uc.SongWriterId) {
Song = s
});
}
return View("songs", svm);
}
这是我的视图代码:
<li>
<input type="text" class="textbox" name="filter" />
<input type="hidden" value="@ViewBag.Filters" name="filters" />
</li>
当我提交表单时,似乎一切正常,但是,ViewBag.Filters 现在包含列表列表?
- 索引操作的第一次运行显示隐藏字段中过滤器的值 [""]。
- 如果我为过滤器提交 'asdf' 值,我会得到 ["[\"\"]","asdf"]。
- 如果我再次提交过滤器的值为 'foo',我会得到 ["[\"[\\"\\"]\",\"asdf\"]","foo"]。
有人对我做错了什么有任何想法吗?似乎 Json 解析器将过滤器的值解释为列表中的单个元素,我只是不知道如何解决这个问题。任何帮助将不胜感激。