ASP.NET MVC 5多表单持久搜索url查询的Get方法
我在一个razor视图中有两个表单,它们调用相同的控制器操作 如果我通过搜索输入过滤搜索结果,url将保留查询参数和值,例如?SearmTerm=value,这很好 但是,如果我想使用其他过滤器向下搜索,例如,我从下拉列表中选择一个选项,然后单击以另一种形式包装的搜索按钮,则会删除?SearmTerm=Value,并添加一个新的查询参数CategoryId=12 我知道,如果我使用一个表单,搜索参数和过滤器确实会保留在url查询字符串中。是否可以使用多个表单执行此操作?我希望它能像这样工作,您可以通过搜索按钮添加任意多个过滤器,并且查询url字符串与所有参数及其值保持一致 请参阅我目前拥有的代码 Index.cshtmlASP.NET MVC 5多表单持久搜索url查询的Get方法,asp.net,asp.net-mvc,razor,asp.net-mvc-5.2,Asp.net,Asp.net Mvc,Razor,Asp.net Mvc 5.2,我在一个razor视图中有两个表单,它们调用相同的控制器操作 如果我通过搜索输入过滤搜索结果,url将保留查询参数和值,例如?SearmTerm=value,这很好 但是,如果我想使用其他过滤器向下搜索,例如,我从下拉列表中选择一个选项,然后单击以另一种形式包装的搜索按钮,则会删除?SearmTerm=Value,并添加一个新的查询参数CategoryId=12 我知道,如果我使用一个表单,搜索参数和过滤器确实会保留在url查询字符串中。是否可以使用多个表单执行此操作?我希望它能像这样工作,您可
<div id="filterAccordion" class="body" aria-multiselectable="true">
<ul>
<li>
<div class="title" role="tab" id="Location">
Category
<a data-toggle="collapse" data-icon="filterIcon" data-parent="#filterAccordion" href="#filterCollapseOne" aria-controls="filterCollapseOne">
<span class="icon icon-keyboard_arrow_down"></span>
</a>
</div>
<div id="filterCollapseOne" class="collapse content" role="tabpanel" aria-labelledby="Location">
@using (Html.BeginForm("Index", "Directory", FormMethod.Get))
{
@Html.DropDownListFor(model => model.CategoryId, @Model.DirectoryCategories, "Select Category", htmlAttributes: new { @class = "custom-select form control" })
<div class="form-group">
<input type="submit" class="btn search-btn btn-primary" value="Search" />
</div>
}
</div>
</li>
</ul>
public class DirectoryIndexViewModel
{
public List<Models.Directory> ActiveDirectories { get; set; }
public IEnumerable<SelectListItem> DirectoryCategories { get; set; }
public string SearchTerm { get; set; }
public string SortBy { get; set; }
public int CategoryId { get; set; }
}
为什么是两种形式而不是一种形式?(你链接到的网站只有一个表单。)嗨@StephenMuecke我已经更新了链接,链接会转到结果页面,你可以在那里向下搜索。这也是我不想在一个视图中使用多个表单的原因,这样我可以保持视图页面整洁,然后将所有内容包装到一个表单中。我不知道为什么您认为多个表单可以使它“整洁”。你一次只能提交一份表格,所以没有意义。但您可以始终使用javascript拦截
.submit()
事件,取消它并基于控件构建自己的url,然后使用location.href=yourUrl代码>重定向。感谢@StephenMuecke提供的信息。我还注意到,carsales网站似乎在大多数搜索过滤器中保留了一个名为“数据占位符”的自定义html-5属性中的查询参数及其值。为什么是两个表单而不是一个表单?(你链接到的网站只有一个表单。)嗨@StephenMuecke我已经更新了链接,链接会转到结果页面,你可以在那里向下搜索。这也是我不想在一个视图中使用多个表单的原因,这样我可以保持视图页面整洁,然后将所有内容包装到一个表单中。我不知道为什么您认为多个表单可以使它“整洁”。你一次只能提交一份表格,所以没有意义。但您可以始终使用javascript拦截.submit()
事件,取消它并基于控件构建自己的url,然后使用location.href=yourUrl代码>重定向。感谢@StephenMuecke提供的信息。我还注意到,carsales网站似乎在大多数搜索过滤器中都有一个名为“数据占位符”的自定义html-5属性,其中包含查询参数及其值。
public class DirectoryIndexViewModel
{
public List<Models.Directory> ActiveDirectories { get; set; }
public IEnumerable<SelectListItem> DirectoryCategories { get; set; }
public string SearchTerm { get; set; }
public string SortBy { get; set; }
public int CategoryId { get; set; }
}
[HttpGet]
public ActionResult Index(DirectoryIndexViewModel model)
{
var query = _directoryRepository.GetAllActiveDirectories();
var categories = _selectListService.GetDirectoryCategories(model.CategoryId);
var searchTerm = model.SearchTerm;
if (!String.IsNullOrEmpty(searchTerm))
{
query = query.Where(d => d.Name.ToUpper().Contains(searchTerm.ToUpper()));
}
query = query.OrderByDescending(d => d.IsFeatured);
return View(new DirectoryIndexViewModel
{
ActiveDirectories = query.ToList(),
DirectoryCategories = categories == null ? null : categories,
SearchTerm = searchTerm,
CategoryId = model.CategoryId
});
}