Asp.net mvc 3 使用Asp.NETMVC并传递搜索/筛选条件时异步重新加载JQGrid

Asp.net mvc 3 使用Asp.NETMVC并传递搜索/筛选条件时异步重新加载JQGrid,asp.net-mvc-3,jqgrid,jqgrid-asp.net,Asp.net Mvc 3,Jqgrid,Jqgrid Asp.net,我正在使用JQSuite的Trirand.Web.MVC dll将JQGrid集成到我的MVC 3应用程序中 我正在使用JQGrid的HTML助手,因此在我看来,我有以下几点: @Html.Trirand().JQGrid(Model.MyGrid, "Grid") 我知道我可以使用以下代码通过单击按钮重新加载网格: $("#Grid").trigger("reloadGrid"); 这将重新加载网格,调用我在用于设置JQGrid的控件代码中指定的操作方法 我在页面上有其他用于搜索/过滤的控

我正在使用JQSuite的Trirand.Web.MVC dll将JQGrid集成到我的MVC 3应用程序中

我正在使用JQGrid的HTML助手,因此在我看来,我有以下几点:

@Html.Trirand().JQGrid(Model.MyGrid, "Grid")
我知道我可以使用以下代码通过单击按钮重新加载网格:

$("#Grid").trigger("reloadGrid");
这将重新加载网格,调用我在用于设置JQGrid的控件代码中指定的操作方法

我在页面上有其他用于搜索/过滤的控件,这些控件可以很好地传递给action方法

我找到了setGridParam方法,它似乎表明您可以执行以下操作:

$("#Grid").setGridParam({ someParam: 'blah' }).trigger("reloadGrid");
或者这个:

$("#Grid").jqGrid('setGridParam', { postData: { someParam: 'somevalue'} }).trigger("reloadGrid");
但是我的action方法上的someParam参数并没有用这两种方法填充

如何在JQGrid上设置这些,以便在执行重新加载时通过操作方法拾取它们

更新: 我现在已经尝试了另一个参数的这种方法,它确实有效

所以现在我有:

$("#Grid").jqGrid('setGridParam', { postData: {
            someParam: 'somevalue', 
            paramTwo: ' some value',
            paramThree: 'some other value'
        } }).trigger("reloadGrid");
someParam不起作用,但Param2和Param3起作用

奇怪

什么可以阻止一个参数工作

更新2: 使用Oleg的建议如下:

var myGrid = jQuery("#Grid").jqGrid({                
                postData: {
                    someParam: function () { return $("#txtBox1").val(); },
                    paramTwo: function () { return $("#txtBox2").val(); },
                    paramThree: function () { return $("#txtBox3").val(); }
                }
            });

        myGrid.trigger('reloadGrid'); 

…没有一个值被发送通过。在重新加载之前,我已经验证了JQuery返回的值是否正确。

如果我了解您是否正确,您可以使用
postData
参数向服务器发送其他参数。最简单的方法是使用
postData
方法(属性作为函数):

你可以找到更多的信息。在这种情况下,将在对操作的任何请求中读取当前值,并将该值作为名为
myCustomParam
的附加参数发送

如果需要从表单中获取所有控件的值,可以使用函数并将所有结果作为一个附加参数发送

您可以使用
getGridParam
获取对
postData
参数的引用,并设置/更改新的附加属性。因为
getGridParam
返回对其内部参数的引用,如果您请求对象参数,则不需要使用
setGridParam

已更新:我不知道在创建网格之前或之后在哪里执行代码。您可以尝试以下代码

<script type="text/javascript">
    $(function () {
        var $grid = $("#<%= JQGrid1.ClientID %>");
        if ($grid.length > 0 && $grid[0].grid !== undefined) {
            var postData = $grid.jqGrid("getGridParam", "postData");
            postData.myParam = function () {
                return "test data";
            };
        } else {
            $.extend($.jgrid.defaults, {
                postData: {
                    myParam: function () {
                        return "test data";
                    }
                }
            });
        }
    });
</script>

$(函数(){
var$grid=$(“#”);
如果($grid.length>0&&$grid[0].grid!==未定义){
var postData=$grid.jqGrid(“getGridParam”、“postData”);
postData.myParam=函数(){
返回“测试数据”;
};
}否则{
$.extend($.jgrid.defaults{
postData:{
myParam:函数(){
返回“测试数据”;
}
}
});
}
});

我希望它在这两种情况下都能起作用。

是的,非常感谢奥列格的帮助,因为他帮助我找到了答案

问题是post数据中已经指定了“SomeParam”,因此我必须使用以下表单扩展现有数据:

('#grid').jqGrid({                 
                serializeGridData: function(postData) { 
                  var newPostData = $.extend(postData, {
                      someParam: return $("#txtBox1").val(), 
                      paramTwo: return $("#txtBox1").val(),
                      paramThree: return $("#txtBox1").val(),
                  }); 

                  return $.param(newPostData); 
                } 
            }).trigger("reloadGrid");

这帮了我的忙,Oleg也在那里发了帖子。

谢谢Oleg,是的,这基本上就是我在示例中所做的,只是尝试传递测试数据,而不是像您的示例那样与控件挂钩。但是,请参阅更新。我认为发布的数据在我呼叫时被保留并传递到reload@Ozz:我不明白为什么
someParam
应该工作,而
paramTwo
工作。我建议您根本不要使用
setGridParam
。如果使用
getGridParam
并检查
postData
返回值,您将看到
postData
不是空的。因此,您应该向
postData
添加附加属性,而不是替换
postData
。或者您可以使用
getGridParam
$.extend
setGridParam
。再次感谢Oleg,我现在明白了。我已经用你的建议更新了我的问题。你提供的链接看起来像是在用HTML创建JQGrid时设置了参数,我正在使用HTML助手,然后试图通过点击按钮来设置帖子数据-这有关系吗?@Ozz:看看我答案的更新部分。我希望它能起作用。我不使用jqGrid的商业版本,所以我不能向您推荐最佳方法创建jqGrid。在中只能执行一次。如果下次什么都没发生时执行它。因此,“UPDATED2”中的代码不应该起任何作用。使用
serializeGridData
的方式应该与使用
postData
的方式完全相同。我认为问题存在于代码中未包含在问题文本中的部分。无论如何,你至少可以找到一种在你的项目中起作用的方法。这是C代码,但无法在其中设置post数据。jqGrid没有C行。我仍然认为你使用了。此外,我确信错误不在您发布的代码中。错误必须在外部。例如,如果你将你提出的代码或我之前发布给你的代码放在错误的地方。是否将JavaScript代码放在
$(function(){/*代码必须在这里*/})的内部?Oleg,是的,我正在使用JQSuite,它是JQGrid,但不是吗?只是一个围绕JQGrid本身的.Net包装器。您能否将代码建议扩展到不仅仅是$(function(){/*代码必须在这里*/})??
('#grid').jqGrid({                 
                serializeGridData: function(postData) { 
                  var newPostData = $.extend(postData, {
                      someParam: return $("#txtBox1").val(), 
                      paramTwo: return $("#txtBox1").val(),
                      paramThree: return $("#txtBox1").val(),
                  }); 

                  return $.param(newPostData); 
                } 
            }).trigger("reloadGrid");