2013-02-11 95 views
0

我正在編寫一個增強的搜索功能,用於收集已有的和已遇到的問題。我試圖在窗體的隱藏字段中存儲List,以便每次用戶發佈窗體時都可以添加List。收集篩選(通過列表<String>查看並返回到控制器)

這裏是我的控制器代碼:

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解析器將過濾器的值解釋爲列表中的單個元素,我只是不知道如何解決這個問題。任何幫助將不勝感激。

回答

0

我找到了解決方案!

如果我將列表轉換爲CSV字符串,模型綁定器會正確解釋它。

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