使用Asp.Net MVC并传递搜索/过滤条件时,异步重新加载JQGrid

时间:2012-06-11 12:19:21

标签: asp.net-mvc-3 jqgrid jqgrid-asp.net

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

我正在使用JQGrid的HTML帮助器,所以在我的View中我有以下内容:

@Html.Trirand().JQGrid(Model.MyGrid, "Grid")

我知道我可以通过使用以下代码点击按钮来重新加载网格:

$("#Grid").trigger("reloadGrid");

这将重新加载网格,调用我在控制器代码中指定的Action方法来设置JQGrid。

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

我找到了setGridParam方法,它似乎表明你可以做类似的事情:

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

或者这个:

$("#Grid").jqGrid('setGridParam', { postData: { someParam: 'somevalue'} }).trigger("reloadGrid");

但我的action方法中的someParam参数没有填充任何方法

如何在JQGrid上设置它们,以便在重新加载时通过Action方法拾取它们?

更新: 我现在已经尝试了这个方法用于另一个参数,它可以工作!

所以现在我有:

$("#Grid").jqGrid('setGridParam', { postData: {
            someParam: 'somevalue', 
            paramTwo: ' some value',
            paramThree: 'some other value'
        } }).trigger("reloadGrid");

someParam不起作用,但paramTwo和ParamThree可以正常工作。

奇怪!

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

UPDATE2: 使用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在重新加载之前返回正确的值。

2 个答案:

答案 0 :(得分:2)

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

postData: {
    myCustomParam: function () { return $("#myInputFiled").val(); }
}

您可以找到更多信息here。在的情况下,将在任何请求处读取当前值,该值将作为附加参数发送,名称为myCustomParam

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

您可以使用postData引用getGridParam参数并设置/更改新的附加属性。因为如果您要求提供对象参数,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>

我希望它能在两种情况下都有效。

答案 1 :(得分:0)

是的,非常感谢OLEG的帮助,因为它让我得到了答案!

问题是已经在帖子数据中指定了“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");

post帮我解决了这个问题,Oleg也在那里发帖。