0

私は自分が持っているコレクションの拡張検索機能の作成に取り組んでおり、問題が発生しました。ユーザーがフォームを投稿するたびにリストを追加できるように、フォームの非表示フィールドにリストを保存しようとしています。

これが私のコントローラーコードです:

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パーサーがフィルターの値をリスト内の単一の要素として解釈しているようです。これを修正する方法がわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

0

私は解決策を見つけました!

リストをCSV文字列に変換すると、モデルバインダーはそれを正しく解釈します。

ViewBag.Filters = filters.Aggregate("", (s, x) => string.IsNullOrEmpty(s) ? x : s + ", " + x);
于 2013-02-11T20:33:10.553 に答える