【问题标题】:How to repeat the same ASP.NET MVC action again?如何再次重复相同的 ASP.NET MVC 操作?
【发布时间】:2009-02-04 23:59:01
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我认为默认情况下没有ActionLink 重载可以帮助您做到这一点。您需要使用要包含的参数填充 RouteValueDictionary 实例。

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

    【讨论】:

    • 我试过这个。当参数为 n 时 categoryIDs=2,3,4,5 的格式,它不会绑定到操作方法签名中的 List。显然,绑定的唯一方法是使用重复参数。如果一切都失败了,我可以创建一个新的动作,在那个地方接受一个字符串。
    • 这就是我所说的 - 操作方法需要将字符串解析为整数列表。也就是说,您必须在 action 方法中编写代码来执行此操作,因为我认为 ASP.NET MVC 不会自动将其绑定到参数。
    【解决方案2】:

    你应该可以这样做:

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

    【讨论】:

    • 它没有拾取额外的参数。我的链接显示为 /Program/List?page=2 而不是 /Program/List?categoryIDs=2&categoryIDs=3&categoryIDs=4&categoryIDs=5&school=&stateID=&page=2
    • @Haacked,你知道他们正在用你的头像重新制作电影吗? Samuel L Jackson 将扮演那个家伙。
    • 我最终不得不通过查看 Request.Querystring 并将其拆分为 Buu 指出的手动绑定它。这样,当有多个 categoryID 参数或 CSV 时,它就可以工作。这种行为是错误还是设计使然?
    • 哦,我没有意识到您希望所有其他参数都作为查询字符串传递。我们不会将“环境”值传递给查询字符串。它们必须被定义为路径的一部分。 @Simulcal - 是的,我听说过。会很棒的!
    【解决方案3】:

    我喜欢将一个对象作为参数传递给搜索动作,然后将参数对象传递给视图。所以在你的控制器中有一些这样的代码(注意我使用的是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,页面声明如下:

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

    然后在你的搜索视图中,你可以做这样的事情......

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

    【讨论】:

      猜你喜欢
      • 2014-10-20
      • 1970-01-01
      • 2011-06-26
      • 2010-12-19
      • 2010-11-13
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多