是否有使用 POST 而不是 GET 的 MVC 寻呼机?

Posted

技术标签:

【中文标题】是否有使用 POST 而不是 GET 的 MVC 寻呼机?【英文标题】:Is there an MVC Pager that uses POST instead of GET? 【发布时间】:2012-06-23 18:19:27 【问题描述】:

这是我的问题。我有一个 SearchViewModel 有大量搜索条件,这些值根本不适合 URL。我目前正在使用Troy Goode's html.PagedListPager,但它被设计为使用Url.Action() 来发送URL 中的参数。这是一个例子。我不认为客户端过滤是一个选项,因为我会有很多记录。

 @Html.PagedListPager(
        (IPagedList)@Model.SearchResults,
        page => Url.Action("Results", 
            new 
                YearBuiltFrom = Model.YearBuiltFrom,
            
                ))

如果您只有一两个简单参数,这是一个很好的解决方案。

搜索视图模型

  public class SearchViewModel
    

        public int? page  get; set; 
        public int? size  get; set; 

        [IgnoreDataMember]
        public IPagedList<Property> SearchResults  get; set; 

        public string[] Locations  get; set; 

        [IgnoreDataMember]
        public MultiSelectList LocationOptions  get; set; 
        
        
        public string[] ZipCodes  get; set; 

        [IgnoreDataMember]
        public MultiSelectList ZipCodeOptions  get; set; 


        [Display(Name="Year Built")]
        public int? YearBuiltFrom   get; set; 
     
        [Display(Name = "Year Built")]
        public int? YearBuiltTo  get; set; 
        public int? SqftFrom  get; set; 
        public int? SqftTo  get; set; 
        public string Bedrooms  get; set; 
        public string Bathrooms  get; set; 
        [DataType(DataType.Date)]
        public DateTime? SalesFrom  get; set; 
        [DataType(DataType.Date)]
        public DateTime? SalesTo  get; set; 
        public int? SaleAmountFrom  get; set; 
        public int? SaleAmountTo  get; set; 
        public int? LandAreaFrom  get; set; 
        public int? LandAreaTo  get; set; 
        
        public string[] Waterfront  get; set; 

        [IgnoreDataMember]
        public MultiSelectList WaterfrontOptions  get; set; 

     
        
        //TODO: Implement LandAreaType as a search parameter
        //public string LandAreaType  get; set; 
        public Boolean? IsVacant  get; set; 
        
        public string[] PropertyFeatures  get; set; 

        [IgnoreDataMember]
        public MultiSelectList PropertyFeatureOptions  get; set; 

    

【问题讨论】:

只是一个考虑因素。在发布帖子时,您的值对用户是隐藏的,这使得 url 很漂亮。但是,如果用户想要共享或收藏搜索结果,他们将无法这样做。看起来您进行了非常密集的搜索。要分享或保存结果,他们必须告诉分享结果的人以及他们是如何找到结果的,这需要告诉他们他们为上面列出的每个标准项输入的所有值。 【参考方案1】:

我不熟悉这样的控件。我认为最简单的方法是使用 javascript 来劫持对寻呼机锚点的点击,并通过取消将由锚点引起的默认重定向来动态构建 POST 请求。要构建此 POST 请求,您可以将当前页面值动态设置到搜索表单的隐藏字段中并触发此表单的提交,以便它再次执行搜索,但页面参数已更改。

举个例子:

<!-- Search form containing all the search criteria fields including the current page number
@using (Html.BeginForm(null, null, FormMethod.Post, new  id = "searchForm" ))

    @Html.EditorFor(x => x.SearchCriteria)
    <button type="submit">Search</button>


<!-- Here will be displayed the results
<div id="results">
    @Html.DisplayFor(x => x.SearchResults)
</div>

现在我们可以订阅寻呼机上的点击事件了:

$(function() 
    $('#results a').click(function() 
        // get the url of the page link
        var url = this.href;

        var page = ... extract the page parameter from the page link

        // update a hidden field inside the search form with this value
        $('#page').val(page);

        // trigger the search
        $('#searchForm').submit();

        // stop the link from navigating to the url it is pointing to
        return false;
    );
);

【讨论】:

你知道我在哪里可以看到样品吗?这是否需要我将模型序列化为隐藏控件? 不,你不需要序列化任何东西。该模型已经在相应输入字段下的搜索表单中。我已经更新了我的答案以提供一些指导。 @MVCylon 如果您使用的是最新版本,您可以使用 $(".PagedList-pager a") 选择由 PageList 插件生成的锚链接,您可以通过 this.href 获取页面编号.split('=')[1] 我将寻呼机的pagesize 作为模型的一部分。因此,在渲染我的视图时会创建一个 ID 为 pagesize 的字段。有没有办法利用它作为这个设计的一部分? PS,这很好用!谢谢。

以上是关于是否有使用 POST 而不是 GET 的 MVC 寻呼机?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Laravel 默认通过 POST 注销(而不是 GET)? [复制]

ASP.Net MVC - GET/POST 具有不同模型时的 ModelState.AddModelError

Response.Redirect 使用 POST 而不是 Get?

使用 urllib2 进行 POST 调用而不是 GET

在自定义授权 MVC4 Web Api 中访问 post 或 get 参数

python-requests 发出 GET 而不是 POST 请求