Частичное представление возвращает значение null при нажатии кнопки отправки - PullRequest
0 голосов
/ 11 июля 2020

Мой сценарий таков, что я хочу, чтобы каждое поле отображалось в раскрывающемся списке частичного отображения. Я буду получать списки из разных баз данных, например, по категории, городу и др. Это поможет пользователям легче использовать поиск. Я успешно получил список из базы данных и отобразил его как раскрывающийся список, но у меня возникла проблема с отправкой этого выбранного значения поля в режим поиска.

Я придумал способ отправить выбранное значение из раскрывающегося списка с помощью указывающее имя на свойство класса поиска. Как я сделал в моем частичном представлении.

@Html.DropDownListFor(m => m.Search.City, new SelectList(Model.Cities, "Id", "Name"), "จังหวัด", new { @class = "form-control" })

m.Search.City это указывает на свойство City в Search Class. но по какой-то причине, когда я выбрал раскрывающийся список и щелкнул отправить и просмотреть, отправьте null в класс поиска.

Кто-нибудь знает, как предотвратить эту ошибку или есть лучший подход к этой проблеме? любая помощь будет оценена. Спасибо.

Мое действие будет выглядеть так

[ChildActionOnly]
    public ActionResult SearchBox()
    {

        var categories = db.Categories.ToList();
        var counties = db.Counties.ToList();
        var cities = db.Cities.ToList();
        var search = new SearchViewModel
        {
            Categories = categories,
            Counties = counties,
            Cities = cities

        };
        return PartialView("_AdsSearch", search);
    }

Внутри действия будет возвращен список каждого раскрывающегося списка, который будет отображаться в представлении SearchBox.

My SearchViewModel будет выглядят так

public class SearchViewModel
{
    public IEnumerable<Category> Categories { get; set; }
    public IEnumerable<County> Counties { get; set; }
    public IEnumerable<City> Cities { get; set; }


    public Search Search { get; set; }
}

и мое представление с использованием модели Kaiban.ViewModel.SearchViewModel

Html.BeginForm("SearchAds", "Ads", FormMethod.Post, new { @class = "form-horizontal"}))


<div class="row">
    <div class="col-sm-3">
        @Html.TextBoxFor(m => m.Search.Location, new { placeholder = "ค้นหาจากทำเล", @class = "form-control", rows = "5" })
        @Html.ValidationMessageFor(m => m.Search.Location)
    </div>
    <div class="col-sm-2">
        @Html.DropDownListFor(m => m.Search.Category, new SelectList(Model.Categories, "Id", "Name"), "ประเภท", new { @class = "form-control" })
        @Html.ValidationMessageFor(m => m.Search.Category)
    </div>
    <div class="col-sm-2">
        @Html.DropDownListFor(m => m.Search.City, new SelectList(Model.Cities, "Id", "Name"), "จังหวัด", new { @class = "form-control" })
        @Html.ValidationMessageFor(m => m.Search.City)
    </div>
    <div class="col-sm-2">
        @Html.DropDownListFor(m => m.Search.County, new SelectList(Model.Counties, "Id", "Name"), "เขตหรืออำเภอ", new { @class = "form-control", @disabled = "disabled"})
        @Html.ValidationMessageFor(m => m.Search.County)
    </div>
    <div class="col-sm-2">
        <div style="float: right">
            <button type="submit" class="btn-search btn-success">ค้นหา</button>
        </div>
    </div>
</div>

И мое действие SearchAds с http-сообщением, которое, когда пользователь нажимает отправить поиск, будет использовать это действие .

[HttpPost]
    public ActionResult SearchAds(Search searchModel)
    {
        var result = db.Adses.AsQueryable();
        if (searchModel != null)
        {
            if (searchModel.Id.HasValue)
                result = result.Where(x => x.Id == searchModel.Id);

            if (!string.IsNullOrEmpty(searchModel.Category))
                result = result.Include("Category").Where(x => x.Category.Name.Contains(searchModel.Category));

            if (!string.IsNullOrEmpty(searchModel.County))
                result = result.Include("Category").Where(x => x.County.Name.Contains(searchModel.County));

            if (!string.IsNullOrEmpty(searchModel.City))
                result = result.Include("Category").Where(x => x.City.Name.Contains(searchModel.City));
        }
        return View(result);
    }

У меня есть режим поиска, который используется для получения ввода от пользователя, и он выглядит так, с фильтром NotMapped он не будет создан в базе данных.

[NotMapped]
public class Search
{
    public int? Id { get; set; }
    public string Category { get; set; }
    public string City { get; set; }
    public string County { get; set; }
    public string Location { get; set; }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...