Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET MVC 5多表单持久搜索url查询的Get方法_Asp.net_Asp.net Mvc_Razor_Asp.net Mvc 5.2 - Fatal编程技术网

ASP.NET MVC 5多表单持久搜索url查询的Get方法

ASP.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查询字符串中。是否可以使用多个表单执行此操作?我希望它能像这样工作,您可

我在一个razor视图中有两个表单,它们调用相同的控制器操作

如果我通过搜索输入过滤搜索结果,url将保留查询参数和值,例如?SearmTerm=value,这很好

但是,如果我想使用其他过滤器向下搜索,例如,我从下拉列表中选择一个选项,然后单击以另一种形式包装的搜索按钮,则会删除?SearmTerm=Value,并添加一个新的查询参数CategoryId=12

我知道,如果我使用一个表单,搜索参数和过滤器确实会保留在url查询字符串中。是否可以使用多个表单执行此操作?我希望它能像这样工作,您可以通过搜索按钮添加任意多个过滤器,并且查询url字符串与所有参数及其值保持一致

请参阅我目前拥有的代码

Index.cshtml

<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
  });
}