繁体   English   中英

搜索时如何保存查询值? ASP.NET MVC

[英]How to save query values when searching? ASP.NET MVC

我有这样一种动作方法:

[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Search(String filter, String value, Int32? page) {
    var set = new List<Employee>();
    switch(filter) {
    case "by-name": {
            set = this.repository.Get(
                e => (e.LastName + " " + e.FirstName + " " + e.MiddleName) == value
            ).ToList();
            break;
        }
        case "by-empn": {
            set = this.repository.Get(
                e => e.EmployeeNumber == value
            ).ToList();
            break;
        }
        default: return RedirectToAction("Search", "Employee"); 
    }

    ViewBag.SearchedEmployees = set.Count();
    return View(set.ToPagedList(page ?? 1, PageSize));
}

搜索视图是这样的:

@if(Model.Count > 0) {
    foreach(var item in Model) {
        Html.RenderPartial("Employee.Card", item);
    }

    @Html.PagedListPager(
        Model,
        page => Url.Action("Search", new { page = page }),
        new PagedListRenderOptions {
            LinkToFirstPageFormat = "<< Beginning",
            LinkToPreviousPageFormat = "< Back",
            LinkToNextPageFormat = "Forth >",
            LinkToLastPageFormat = "End >>"
        }
    )
}

搜索表单显示为部分视图:

@using(Html.BeginForm("Search", "Employee", FormMethod.Get, new { @class = "search-form" }))
{
    <p>
        @Html.TextBox("value")
    </p>
    <p>
        @Html.RadioButton("filter", "by-name", true) By name <br/>
        @Html.RadioButton("filter", "by-empn") By empn <br/>
    </p>
    <p>
        <input type="image" src="@Url.Content("~/Content/Images/Search.png")" />
    </p>
}

问题:我有N页面链接。 当我尝试转到第二页时,我面临重定向的无限循环。 这就是我执行动作的方式-触发了默认情况。 那么在第二个操作调用中, filter/value值是否为null 为什么? 如何重构搜索动作?

另外,我应该如何为这种动作配置路由?

谢谢!

编辑

因此,搜索操作的路由应如下所示:

routes.MapRoute(
    null,
    "{controller}/{action}/Page{page}/filter{filter}/val{value}",
    new { controller = "Employee", action = "Search" }
);

编辑2

因此可以写下一个:

page => Url.Action("Search", new { filter = ViewBag.SearchFilter, value = ViewBag.SearchValue, page = page }),

在控制器内部:

public ActionResult Search(String filter, String value, Int32? page) {

    ViewBag.SearchFilter = filter;
    ViewBag.SearchValue = value;
    // ...
}

这是正确的吗?

那么在第二个操作调用中,过滤器/值的值是否为空? 为什么?

因为它们对应的输入字段位于单独的表单中,所以永远不会发送到服务器。

您似乎正在使用一些自定义的Html.PagedListPager帮助程序(您尚未显示的代码),但是我想这个帮助程序将页面链接生成为锚点,并且它根本没有考虑到任何当前查询字符串或POSTed值生成这些链接时。 因此,分页链接的href看起来像是/SomeController/Search?page=5而不是正确的参数,后者会考虑到/SomeController/Search?page=5&filter=somefilter&value=somevalue那些参数。

现在,您可以轻松地理解为什么控制器操作中的filtervalue参数始终为空。 这是因为单击分页链接时,您永远不会将它们发送到服务器。

因此,为了解决此问题,您可以修改用于生成分页链接的自定义HTML帮助器,以包括这些附加参数。 也许助手允许您传递其他参数? 如果这是您正在使用的某些第三方插件,请查阅文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM