Asp.net mvc 集合筛选(通过列表<;字符串>;查看并返回控制器)

Asp.net mvc 集合筛选(通过列表<;字符串>;查看并返回控制器),asp.net-mvc,json,razor,variable-assignment,Asp.net Mvc,Json,Razor,Variable Assignment,我正在为我拥有的收藏编写一个增强的搜索功能,我遇到了一个问题。我试图在表单中的隐藏字段中存储一个列表,以便每次用户发布表单时都可以添加到该列表中 这是我的控制器代码: public ActionResult Index(Int32 page = 0, List<String> filters = null, String filter = "", Int32 pageSize = 10, Boolean sortAscending = true, String sortBy = "T

我正在为我拥有的收藏编写一个增强的搜索功能,我遇到了一个问题。我试图在表单中的隐藏字段中存储一个列表,以便每次用户发布表单时都可以添加到该列表中

这是我的控制器代码:

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);
}
public ActionResult索引(Int32 page=0,List filters=null,String filter=“”,Int32 pageSize=10,Boolean sortAscending=true,String sortBy=“Title”){
UserContext uc=SecurityHelpers.GetUserData();
LinkedList svm=新LinkedList();
var songs=\u songRepository.FindAll()
.Where(a=>a.Title.Contains(过滤器)||
a、 歌词。包含(过滤器)||
a、 Description.Contains(filter));
ViewBag.resultCount=songs.Count();
ViewBag.Page=页面;
ViewBag.PageSize=页面大小;
ViewBag.SortAscending=排序;
if(过滤器==null){
过滤器=新列表();
}
过滤器。添加(过滤器);
ViewBag.Filters=newJavaScriptSerializer().Serialize(过滤器);
songs=songs.Sort(排序,排序)
.跳过(页面*页面大小)
。取(页面大小);
foreach(歌曲中的歌曲){
((LinkedList)svm).AddLast(新的SongViewModel(uc.SongWriterId){
宋=s
});
}
返回视图(“歌曲”,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解析器似乎将过滤器的值解释为列表中的单个元素,我只是不知道如何解决这个问题。任何帮助都将不胜感激。

    我找到了解决方案

    如果我将列表转换为CSV字符串,模型绑定器将正确解释它

    ViewBag.Filters = filters.Aggregate("", (s, x) => string.IsNullOrEmpty(s) ? x : s + ", " + x);