Мой сценарий таков, что я хочу, чтобы каждое поле отображалось в раскрывающемся списке частичного отображения. Я буду получать списки из разных баз данных, например, по категории, городу и др. Это поможет пользователям легче использовать поиск. Я успешно получил список из базы данных и отобразил его как раскрывающийся список, но у меня возникла проблема с отправкой этого выбранного значения поля в режим поиска.
Я придумал способ отправить выбранное значение из раскрывающегося списка с помощью указывающее имя на свойство класса поиска. Как я сделал в моем частичном представлении.
@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; }
}