如何再次重复相同的ASP.NET MVC操作?

时间:2009-02-04 23:59:01

标签: .net asp.net-mvc routing actionlink

我有一个名为List的动作,显示搜索结果。它通过查询字符串接收参数,因为它们是可选的。我的方法签名如下所示:

public ActionResult List(List<int> categoryIDs, string school, int? stateID, int? page)

CategoryIDs是一个多选框,我正在通过GET请求执行所有操作。我需要做的是在我的视图中创建一个链接到下一页但保留相同的搜索参数。我知道我可以手动构建链接但是可以使用任何内置路由方法,尤其是当categoryID必须被格式化为“?categoryID = 1&amp; categoryID = 2&amp; categoryID = 3”才能被绑定到清单?

3 个答案:

答案 0 :(得分:1)

我认为没有ActionLink重载可以帮助您默认执行此操作。您需要使用要包含的参数填充RouteValueDictionary实例。

对于类别列表,请尝试使用categoryIDs=2,3,4,5等s / t,因为RouteValueDictionary中不允许重复键。之后,在action方法中需要将字符串解析为整数列表。

答案 1 :(得分:0)

你应该可以这样做:

默认情况下,应传递所有当前值。我必须尝试一下,以确保我引用正确的过载。

答案 2 :(得分:0)

我喜欢将对象作为参数传递给搜索操作,然后将参数对象传递给视图。所以在你的控制器中有一些代码就像这样(注意我正在使用Rob Conery's PagedList class):

public class SearchParameters {
    public string School { get; set; }
    public int? StateID { get; set; }
    public int? Page { get; set; }

    public SearchParameters GetPage(int page) {
        return new SearchParameters {
            School = School,
            StateID = StateID,
            Page = page
        };
    }
}

public class SearchViewModel {
    public PagedList<[YourResultType]> Results { get; set; }
    public SearchParameters Parameters { get; set; }
}

// ...

public ActionResult Search(SearchParameters parameters) {
    IQueryable<[YourResultType]> query;
    // ... do some stuff to get your search results

    return View("Search", new SearchViewModel {
        Results = query.ToPagedList(parameters.Page - 1), 15),
        Parameters = parameters
    });
}

因此,您的搜索视图继承自通用ViewPage&lt; T&gt;使用这样的页面声明:

<%@ Page ... Inherits="ViewPage<SearchViewModel>" %>

然后在搜索视图中,您可以执行以下操作...

<% for(int i = 0; i < Model.Results.TotalPages; i++) { %>
    <%= Html.ActionLink(i + 1).ToString(), "Search",
        Model.Parameters.GetPage(i + 1)) %>
<% } %>