2

私は次のフォームを持っています:

@model Teesa.Models.SearchModel
@using (Html.BeginForm("Index", "Search", FormMethod.Get, new { id = "SearchForm" }))
{
    <div class="top-menu-search-buttons-div">
        @if (!MvcHtmlString.IsNullOrEmpty(Html.ValidationMessageFor(m => m.SearchText)))
        {
            <style type="text/css">
                .top-menu-search-text
                {
                    border: solid 1px red;
                }
            </style>
        }
        @Html.TextBoxFor(q => q.SearchText, new { @class = "top-menu-search-text", id = "SearchText", name = "SearchText" })
        @Html.HiddenFor(q=>q.Page)
        <input type="submit" value="search" class="top-menu-search-submit-button" />
    </div>
    <div id="top-menu-search-info" class="top-menu-search-info-div">
        Please Select one :
        <hr style="background-color: #ccc; height: 1px;" />
        <div class="top-menu-search-info-checkbox-div">
            @Html.CheckBoxFor(q => q.SearchInBooks, new { id = "SearchInBooks", name = "SearchInBooks" })
            <label for="SearchInBooks">Books</label>
        </div>
        <div class="top-menu-search-info-checkbox-div">
            @Html.CheckBoxFor(q => q.SearchInAuthors, new { id = "SearchInAuthors" })
            <label for="SearchInAuthors">Authors</label>
        </div>
        <div class="top-menu-search-info-checkbox-div">
            @Html.CheckBoxFor(q => q.SearchInTags, new { id = "SearchInTags" })
            <label for="SearchInTags">Tags</label>
        </div>
}

および次のコントローラーとモデル:

namespace Teesa.Models
{
    public class SearchModel
    {
        [Required(ErrorMessage = "*")]
        public string SearchText { get; set; }
        public bool SearchInTags { get; set; }
        public bool SearchInAuthors { get; set; }
        public bool SearchInBooks { get; set; }
        public int Page { get; set; }
        public List<SearchBookModel> Result { get; set; }
        public List<SimilarBookModel> LatestBooks { get; set; }
    }

    public class SearchBookModel
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Author { get; set; }
        public string Summary { get; set; }
        public List<Tags> Tags { get; set; }
        public string StatusName { get; set; }
        public string SubjectName { get; set; }
        public string ThumbnailImagePath { get; set; }
        public string BookRate { get; set; }
        public string RegistrationDate { get; set; }
        public int NumberOfVisit { get; set; }
    }
}

[HttpGet]
public ActionResult Index(SearchModel model)
{
    FillSearchModel(model);
    if (ModelState.IsValid)
    {
            string page = model.Page;
        DatabaseInteract databaseInteract = new DatabaseInteract();
        model.Result = new List<SearchBookModel>();
        List<Book> allBooks = databaseInteract.GetAllBooks();
        List<Book> result = new List<Book>();
        #region 
        if (model.SearchInTags)
        {
            var temp = (from item in allBooks
                        from tagItem in item.Tags
                        where tagItem.Name.Contains(model.SearchText)
                        select item).ToList();
            result.AddRange(temp);
        }
        if (model.SearchInBooks)
        {
            var temp = (from item in allBooks
                        where item.عنوان.Contains(model.SearchText)
                        select item).ToList();
            result.AddRange(temp);
        }
        if (model.SearchInAuthors)
        {
            var temp = (from item in allBooks
                        where item.Author.Contains(model.SearchText)
                        select item).ToList();
            result.AddRange(temp);
        }
        #endregion
        #region Paging
        string itemsPerPage = databaseInteract.GetItemsPerPage();
        int ItemInPage = int.Parse(itemsPerPage);
        var pagingParams = Helpers.SetPagerParameters(page, ItemInPage, result);
        ViewBag.AllPagesCount = pagingParams.AllPagesCount;
        ViewBag.CurrentPageNumber = pagingParams.CurrentPageNumber;
        ViewBag.CountOfAllItems = pagingParams.CountOfAllItems.ToMoneyFormat().ToPersianNumber();
        result = pagingParams.ListData as List<Book> ?? result;
        #endregion
        foreach (var item in result)
        {
            var bookRate = (item.BookRate == null || item.BookRate.Count == 0)
                               ? 0.0
                               : item.BookRate.Average(q => q.Rate);
            model.Result.Add(new SearchBookModel
            {
                Author = item.Author,
                Id = item.Id,
                .
                .
                .
            });
        }
    }
    else
    {
        model.Result = new List<SearchBookModel>();
    }
    return View(model);
}

フォームを送信すると、次のクエリ文字列が表示されます (名前が重複していることに注意してください)。

http://localhost:2817/Search?SearchText=book&Page=2&SearchInBooks=true&SearchInBooks=false&SearchInAuthors=true&SearchInAuthors=false&SearchInTags=true&SearchInTags=false

しかし、それは次のようなものでなければなりません:

http://localhost:2817/Search?SearchText=book&Page=2&SearchInBooks=true&SearchInAuthors=true&SearchInTags=true

どうすれば修正できますか?
ありがとう

4

3 に答える 3

3

Html.Checkbox(および関連するFor...メソッド) は false の非表示の入力を生成し、true のチェックボックスを生成します。これは、バインディング時にモデル バインディングが一貫して機能するようにするためです。

非表示の入力に起因する「false」項目を取り除く必要がある場合は、チェックボックスの入力を自分で作成する必要があります (ヘルパーではなく HTML を使用)。

<input type="checkbox" id="SearchInBooks" name="SearchInBooks">
于 2012-06-18T12:23:54.597 に答える
1

Get メソッドに一致する名前の Post メソッドを作成しないでください。これにより、コードのデバッグがはるかに簡単になります。このような問題を見つけようとする大きな機能はありません。

ただし、重複する URL クエリ文字列を取得する場所が見つかりません。

これにより、結果をモデルにバインドすることもできます。

于 2012-06-18T12:23:56.950 に答える
1

モデル バインディングを正常に実行する場合は、この方法Html.CheckBox/Html.CheckBoxForを使用する必要があります。これは、非表示フィールドもレンダリングするメソッドの性質であるためです。

あなたの人生を楽にするために、むしろPOSTを使うことをお勧めします。それでも GET を使用したい場合は、チェックボックス要素を直接使用する必要がありますが、モデル バインディングの問題に注意する必要があります。ex のチェックボックスがオンになっている場合、すべてのブラウザが「true」を返すわけではありません。firefox は「on」を渡すため、デフォルトのモデル バインダーはエラーをスローします。

その他の代替オプションは、カスタム モデル バインダーを使用するか、submit イベントをリッスンして jquery を使用してフォームを送信することです。

于 2012-06-18T12:41:14.753 に答える