如何在 asp.net core 3.1 mvc 中保留所有查询字符串值?

如何解决如何在 asp.net core 3.1 mvc 中保留所有查询字符串值?

我有一个 asp.net core 3.1 mvc 项目,其中有一个搜索页面(查看)。我通过会话数据持续搜索、过滤和排序条件值。这工作正常,并正确保留数据,但查询字符串不包含我需要的所有信息。

过滤器和搜索的值是通过表单和提交按钮选择的,但排序是通过单击搜索结果中的列标题来选择的。例如:

   <form asp-controller="Companies" asp-action="Index" method="get">
        <p>
           <label>Company Name: </label>
           <select asp-for="CompanyName" asp-items="Model.CompanyName">
                  <option value="">All</option>
           </select> 
           <input type="submit" value="Find" />
        </p>
    </form>

<table class="table">
 <thead>
   <tr>
      <th>
         <a asp-action="Index" asp-route-sortOrder="CompanyName">@Html.displayNameFor(model => model.CompaniesListviewmodelList[0].CompanyName)</a>
      </th>
   </tr>
 </thead>
 <tbody>
     @foreach (var item in Model.CompaniesListviewmodelList)
     {
         <tr>
            <td>
                @Html.displayFor(modelItem => item.CompanyName)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
            </td>
         </tr>
     }
 </tbody>
</table>

如果单击标题以更改排序顺序,则查询字符串中不会出现过滤器等的查询字符串值。

我需要这个的原因是可以将链接发送给其他人。

那么问题是,如何让所有使用过的查询字符串值出现在查询字符串中?

解决方法

在 Index action 方法中,您可以使用 ViewBag 或 ViewData 来存储当前搜索值(CompanyName),然后将其传输到查看页面:

然后,对于排序链接,您可以使用 asp-route-{value} 将当前搜索值添加为路由参数,并通过 ViewData 或 ViewBag 绑定值。代码如下:

 <a asp-action="Index" asp-route-CompanyName="@ViewData["CurrentFilter"]" asp-route-sortOrder="@ViewData["CompanyNameSortParm"]">CompanyName</a>

示例代码如下:

型号:

public class Employee
{
    public int EmployeeId { get; set; }
    public string EmployeeName { get; set; } 
    public string CompanyName { get; set; }
     
}
public class Company
{
    public int CompanyId { get; set; }
    public string CompanyName { get; set; }
    public List<Employee> Employees { get; set; }
}
public class EmployeeVM
{
    public string CompanyName { get; set; }
    public List<Company> AllCompanies { get; set; }
    public List<Employee> Employees { get; set; }
}

控制器:

public class CompaniesController : Controller
{
    public IActionResult Index(string sortOrder,string CompanyName)
    { 
        ViewData["CompanyNameSortParm"] = String.IsNullOrEmpty(sortOrder) ? "companyname_desc" : "";
        ViewData["CurrentFilter"] = CompanyName;

        var employees = from s in repo.GetEmployees()
                       select s;
        if (!String.IsNullOrEmpty(CompanyName))
        {
            employees = employees.Where(s => s.CompanyName.Contains(CompanyName));
        }
        switch (sortOrder)
        {
            case "companyname_desc":
                employees = employees.OrderByDescending(s => s.CompanyName);
                break; 
            default:
                employees = employees.OrderBy(s => s.EmployeeId);
                break;
        }

        EmployeeVM vm = new EmployeeVM();
        vm.Employees = employees.ToList();
        vm.AllCompanies = repo.GetAllCompanies().ToList();

        return View(vm);
    }
}

索引视图:

@model netcore3.Data.EmployeeVM
 
<form asp-controller="Companies" asp-action="Index" method="get">
    <p>
        <label>Company Name: </label>
        <select asp-for="CompanyName" asp-items="@(new SelectList(Model.AllCompanies,"CompanyName","CompanyName"))">
            <option value="">All</option>
        </select>
        <input type="submit" value="Find" />
    </p>
</form>
<table class="table">
    <thead>
        <tr>
            <th>
                EmployeeName
            </th>
            <th>
                <a asp-action="Index" asp-route-CompanyName="@ViewData["CurrentFilter"]" asp-route-sortOrder="@ViewData["CompanyNameSortParm"]">CompanyName</a>
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.Employees)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.EmployeeName)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.CompanyName)
                </td>
                <td>
                    <a asp-action="Edit" asp-route-id="@item.EmployeeId">Edit</a> |
                    <a asp-action="Details" asp-route-id="@item.EmployeeId">Details</a> |
                    <a asp-action="Delete" asp-route-id="@item.EmployeeId">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

结果如下:

enter image description here

参考:

Tutorial: Add sorting,filtering,and paging - ASP.NET MVC with EF Core

Anchor Tag Helper in ASP.NET Core

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?