C#ASP.NET无法对数据库中的搜索结果进行排序

C#ASP.NET无法对数据库中的搜索结果进行排序,c#,asp.net,asp.net-mvc,sorting,search,C#,Asp.net,Asp.net Mvc,Sorting,Search,我在C#ASP.NET中实现了一个设备管理应用程序,并且在我的应用程序中实现了搜索和排序功能 我的问题是,我无法对搜索结果进行排序,而不是在单击“名称”(按名称对结果进行排序)后,它将对所有设备进行排序,而不仅仅是搜索结果 在这个控制器中,我显示没有所有者的设备(UserID==null) 这是我的控制器: public ActionResult deviceList(String sortBy, String search) { if (Session[

我在C#ASP.NET中实现了一个设备管理应用程序,并且在我的应用程序中实现了搜索和排序功能

我的问题是,我无法对搜索结果进行排序,而不是在单击“名称”(按名称对结果进行排序)后,它将对所有设备进行排序,而不仅仅是搜索结果

在这个控制器中,我显示没有所有者的设备(UserID==null)

这是我的控制器:

public ActionResult deviceList(String sortBy, String search)
        {
            if (Session["userID"] != null)
            {
                ViewBag.SortNameParameter = String.IsNullOrEmpty(sortBy) ? "Name desc" : "";
                ViewBag.SortTypeParameter = sortBy == "Type" ? "Type desc" : "Type";
                ViewBag.SortManufacturerParameter = sortBy == "Manufacturer" ? "Manufacturer desc" : "Manufacturer";
                var devices = db.devices.AsQueryable();

                if (devices.Any(x => x.UserID == null))
                {
                    devices = db.devices.Where(x => x.UserID == null);

                    switch (sortBy)
                    {
                        case "Name desc":
                            devices = devices.Where(x => x.DName.Contains(search)).OrderByDescending(x => x.DName);
                            break;
                        ...
                        default:
                            devices = devices.Where(x => x.DName.Contains(search)).OrderBy(x => x.DName);
                            break;
                    }
                    return View(devices.ToList());
                }
丢失的零件按类型、制造商等分类

以下是我的看法:

@using (Html.BeginForm("deviceList", "devices", FormMethod.Get))
                {
                    <label>
                        <b>Search:</b>
                        @Html.TextBox("Search")
                        <input type="submit" value="Search" />
                    </label>
                }
            </div>

            <table class="table table-striped custab">
                <thead>
                    <tr>
                        <th align="center">
                            @Html.ActionLink("Name", "deviceList", new { sortBy = ViewBag.SortNameParameter })
                        </th>
                        <th>
                            @Html.ActionLink("Manufacturer", "deviceList", new { sortBy = ViewBag.SortManufacturerParameter })
                        </th>
                        <th>
                            @Html.ActionLink("Type", "deviceList", new { sortBy = ViewBag.SortTypeParameter })
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.DOS)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.DOSVersion)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.DProcessor)
                        </th>
                        <th align="center">
                            @Html.DisplayNameFor(model => model.DRAM)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.user.userName)
                        </th>
                        <th>Action</th>
                    </tr>
                    @foreach (var item in Model)
                    {
                        <tr>
                            <td>
                                @Html.DisplayFor(modelItem => item.DName)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.DManufacturer)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.DType)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.DOS)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.DOSVersion)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.DProcessor)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.DRAM)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.user.userName)
                            </td>
@使用(Html.BeginForm(“deviceList”、“devices”、FormMethod.Get))
{
搜索:
@文本框(“搜索”)
}
@ActionLink(“名称”,“设备列表”,新的{sortBy=ViewBag.SortNameParameter})
@ActionLink(“制造商”、“设备列表”,新的{sortBy=ViewBag.SortManufacturerParameter})
@ActionLink(“类型”,“设备列表”,新的{sortBy=ViewBag.SortTypeParameter})
@DisplayNameFor(model=>model.DOS)
@DisplayNameFor(model=>model.DOSVersion)
@DisplayNameFor(model=>model.DProcessor)
@DisplayNameFor(model=>model.DRAM)
@DisplayNameFor(model=>model.user.userName)
行动
@foreach(模型中的var项目)
{
@DisplayFor(modelItem=>item.DName)
@DisplayFor(modelItem=>item.DManufacturer)
@DisplayFor(modelItem=>item.DType)
@DisplayFor(modelItem=>item.DOS)
@DisplayFor(modelItem=>item.DOSVersion)
@DisplayFor(modelItem=>item.DProcessor)
@DisplayFor(modelItem=>item.DRAM)
@DisplayFor(modelItem=>item.user.userName)
搜索功能非常有效,但是在搜索结果之后,如果我单击名称(排序),URL中的搜索参数将消失,它将对我的整个列表而不是搜索结果进行排序


请帮我找出我的错误。

只需将搜索更改为搜索此操作即可

public ActionResult deviceList(String sortBy, String Search)
        {
            if (Session["userID"] != null)
            {
                ViewBag.SortNameParameter = String.IsNullOrEmpty(sortBy) ? "Name desc" : "";
                ViewBag.SortTypeParameter = sortBy == "Type" ? "Type desc" : "Type";
                ViewBag.SortManufacturerParameter = sortBy == "Manufacturer" ? "Manufacturer desc" : "Manufacturer";
                var devices = db.devices.AsQueryable();

                if (devices.Any(x => x.UserID == null))
                {
                    devices = db.devices.Where(x => x.UserID == null);

                    switch (sortBy)
                    {
                        case "Name desc":
                            devices = devices.Where(x => x.DName.Contains(Search)).OrderByDescending(x => x.DName);
                            break;
                        ...
                        default:
                            devices = devices.Where(x => x.DName.Contains(Search)).OrderBy(x => x.DName);
                            break;
                    }
                    return View(devices.ToList());
                }

您的问题很明显。当您单击排序链接时,还必须发送筛选器参数

因此,应采取以下行动: 将搜索参数保留在
查看包
设备列表
操作中:

ViewBag.SearchParameter = search;
ViewBag.SortNameParameter = String.IsNullOrEmpty(sortBy) ? "Name desc" : "";
ViewBag.SortTypeParameter = sortBy == "Type" ? "Type desc" : "Type";
ViewBag.SortManufacturerParameter = sortBy == "Manufacturer" ? "Manufacturer desc" : "Manufacturer";
然后在链接中以sortBy相同的方式传递:

@Html.ActionLink("Name", "deviceList", new { search = ViewBag.SearchParameter, sortBy = ViewBag.SortNameParameter  })
@Html.ActionLink("Manufacturer", "deviceList", new { search = ViewBag.SearchParameter, sortBy = ViewBag.SortManufacturerParameter })
@Html.ActionLink("Type", "deviceList", new { search = ViewBag.SearchParameter, sortBy = ViewBag.SortTypeParameter })
并管理文本框的搜索参数:

@Html.TextBox("search", ViewBag.SearchParameter)

当您单击这些链接按名称/制造商/类型排序时,它似乎没有提交表单,因此它只是将您重定向到该链接。当您单击搜索按钮时,它会将表单连同搜索数据发送回控制器,但是
@Html.ActionLink(…)
不会提交表单

您需要将搜索文本与此链接一起发送,可能需要将搜索文本绑定到您的模型并更新链接以包含该链接。请尝试以下操作:

@Html.ActionLink("Name", "deviceList", new { sortBy = ViewBag.SortNameParameter, ViewBag.SearchString })
在表单中,您需要更新它以发送搜索字符串:

<label>
  <b>Search:</b>
  @Html.TextBox("Search", @ViewBag.SearchString)
  <input type="submit" value="Search" />
</label>

搜索:
@Html.TextBox(“Search”,@ViewBag.SearchString)