使用带有 mvc 的 jQuery 数据表服务器端处理。序列化条件表单并将此参数添加到 $ajax.post 方法

Posted

技术标签:

【中文标题】使用带有 mvc 的 jQuery 数据表服务器端处理。序列化条件表单并将此参数添加到 $ajax.post 方法【英文标题】:Use jQuery datatables server-side processing with mvc. Serialize criteria form and add this parameter to $ajax.post method 【发布时间】:2014-05-09 09:33:09 【问题描述】:

我正在使用 mvc 和 jquery 数据表,以及服务端处理。

我创建了两个类模型: 第一个 jQueryParamModel,将 dataTables 参数传递给动作控制器

public class JQueryDataTableParamModel

    /// <summary>
    /// Request sequence number sent by DataTable, same value must be returned in response
    /// </summary>       
    public string sEcho get; set; 

    /// <summary>
    /// Text used for filtering
    /// </summary>
    public string sSearch get; set; 

    /// <summary>
    /// Number of records that should be shown in table
    /// </summary>
    public int iDisplayLength get; set; 

    /// <summary>
    /// First record that should be shown(used for paging)
    /// </summary>
    public int iDisplayStart get; set; 

    /// <summary>
    /// Number of columns in table
    /// </summary>
    public int iColumns get; set; 

    /// <summary>
    /// Number of columns that are used in sorting
    /// </summary>
    public int iSortingCols get; set; 

    /// <summary>
    /// Comma separated list of column names
    /// </summary>
    public string sColumns get; set; 


第二个存在两个自定义搜索条件

 public class Home2Model
    
        public CriteriaModel SearchCriteria1  get; set; 
        public CriteriaModel SearchCriteria2  get; set; 
    

在我使用 Home2Model 创建了一个名为 index.cshtml 的强类型视图之后

 @model GenericSearch.UI.Models.Home2Model

<link href="@Url.Content("~/Content/dataTables/demo_table.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content("~/Scripts/jquery.dataTables.min.js")" type="text/javascript"></script>
<script>



  $(document).ready(function () 
        var oTable = $('#myDataTable').dataTable(
            "bServerSide": true,
            "sAjaxSource": "/Home2/AjaxHandler",
            "bProcessing": false,
            "sServerMethod": "POST",
            "fnServerData": function (sSource, aoData, fnCallback) 

                aoData.push( "name": "hm", "value": $("myForm").serialize() );

                $.ajax(
                    "dataType": 'json',
                    "type": "POST",
                    "url": sSource,
                    "data": aoData,
                    "success": fnCallback
                )
            
        );
    );


 </script>

    <h1>Search</h1>
<br />
@using (Html.BeginForm("Index", "Home2", FormMethod.Post, new  id="myForm"))



 <div >
        @Html.EditorFor(m => m.SearchCriteria1)
        @Html.EditorFor(m => m.SearchCriteria2)
        <br />
        <input type="submit" name="default" value="Filter" />
        <br /><br />
        <table id="myDataTable" class="display">
            <thead>
                <tr>
                    <th>a</th>
                    <th>b</th>
                    <th>c</th>
                    <th>d</th>
                    <th>e</th>
                    <th>f</th>
                </tr>
            </thead>
            <tbody>
            </tbody>
        </table>
    </div>


我已经创建了一个控制器动作来接收输入这个参数:

[HttpPost]
    public ActionResult AjaxHandler(JQueryDataTableParamModel param,Home2Model hm)
    
        return new EmptyResult();
    

JQueryDataTableParamModel 绑定工作正常,但 hm 参数没有被 valorized (null)。 mvc 绑定无法正常工作。

谁能帮帮我?

谢谢你。

【问题讨论】:

【参考方案1】:

$("myForm").serialize() 不会在这里切芥末。首先$("myForm") 是一个选择器,它正在寻找标签&lt;myForm&gt;,我猜它不存在。您可能正在寻找带有 id="myForm" 的 &lt;form&gt; 标记,在这种情况下,正确的选择器应该是 $('#myForm')

话虽如此,.serialize() 方法将简单地将表单输入字段转换为application/x-www-form-urlencoded 有效负载。但是当你将它传递给hm 参数时,它显然不起作用。如果您希望模型绑定器能够正确反序列化它,您需要整个请求有效负载为 application/x-www-form-urlencoded

所以让我推荐你following extension

$.fn.serializeObject = function () 
    var o = ;
    var a = this.serializeArray();
    $.each(a, function () 
        if (o[this.name] !== undefined) 
            if (!o[this.name].push) 
                o[this.name] = [o[this.name]];
            
            o[this.name].push(this.value || '');
         else 
            o[this.name] = this.value || '';
        
    );
    return o;
;

一旦你声明了它,你可以简单地这样做:

$('#myDataTable').dataTable(
    "bServerSide": true,
    "sAjaxSource": "/Home/AjaxHandler",
    "bProcessing": false,
    "sServerMethod": "POST",
    "fnServerData": function (sSource, aoData, fnCallback) 
        var formData = $('#myForm').serializeObject();
        for (var key in formData) 
            if (formData.hasOwnProperty(key)) 
                aoData.push(
                    name: key,
                    value: formData[key]
                );
            
        

        $.ajax(
            "dataType": 'json',
            "type": "POST",
            "url": sSource,
            "data": aoData,
            "success": fnCallback
        )
    
);

您的 AjaxHandler 操作的 2 个参数现在将被正确绑定。只需检查您的 javascript 调试工具中的 Network 选项卡,查看 2 个有效负载之间的差异,您就会明白为什么您的代码无法正常工作。

【讨论】:

我喜欢这个解决方案!

以上是关于使用带有 mvc 的 jQuery 数据表服务器端处理。序列化条件表单并将此参数添加到 $ajax.post 方法的主要内容,如果未能解决你的问题,请参考以下文章

JQuery DataTable 标头未与 ScrollY 和服务器端处理对齐

ASP.NET MVC 在 jQuery 数据表中使用带有按钮 onclick 的模态弹出窗口

使用jquery ui在mvc 4中打开带有参数的模态窗口

如何让 jQuery 验证生成与服务器端 ASP .NET MVC 验证相同的标记?

将带有数据和文件的 JSON 发布到 Web Api - jQuery / MVC

带有 ASP.NET MVC 的 jquery - 调用启用 ajax 的 Web 服务