0

我有这样一个动作方法:

[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;
    // ...
}

这是正确的吗?

4

1 回答 1

1

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

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

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

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

因此,为了解决此问题,您可以修改用于生成分页链接的自定义 HTML 帮助程序以包含这些附加参数。或者也许助手允许你传递额外的参数?如果这是您正在使用的第三方插件,请检查文档。

于 2012-05-15T11:10:58.443 回答