【问题标题】:Reloading JQGrid asynchronously when using Asp.Net MVC and passing search/filter criteria使用 Asp.Net MVC 并传递搜索/过滤条件时异步重新加载 JQGrid
【发布时间】:2012-06-14 08:25:11
【问题描述】:

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

我正在使用 JQGrid 的 HTML 助手,所以在我的视图中我有以下内容:

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

我知道我可以使用以下代码在单击按钮时重新加载网格:

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

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

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

我找到了 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 起作用。

奇怪!

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

更新 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 在重新加载之前返回了正确的值。

【问题讨论】:

  • 代码jQuery("#Grid").jqGrid({...});create jqGrid。 in 只能执行一次。如果你下次执行它什么都没有发生。所以“UPDATED2”中的代码应该什么都不做。

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


【解决方案1】:

如果我理解你的正确,你可以使用postData 参数向服务器发送额外的参数。最简单的方法是使用 postData 具有方法(属性作为函数):

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

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

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

您可以使用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>

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

【讨论】:

  • 感谢 Oleg,是的,这基本上就是我在示例中所做的,只是试图通过测试数据,而不是像您的示例那样与控件挂钩。但是请参阅更新。
  • 我认为发布的数据在我调用重新加载时被保留并传递
  • @Ozz:我不明白为什么someParam 应该工作而paramTwo 工作。我建议你根本不要使用setGridParam。如果您将使用getGridParam 并检查postData 返回的值,您将看到postData 不为空。所以你应该向postData添加附加属性,而不是替换postData。或者,您可以使用getGridParam$.extendsetGridParam
  • 再次感谢 Oleg,我现在明白了。我已经使用您的建议更新了我的问题。您提供的链接看起来像是在 HTML 中创建 JQGrid 时设置了参数,我正在使用 HTML Helper 然后尝试在按钮单击中设置发布数据 - 这有关系吗?
  • @Ozz:看看我回答的更新部分。我希望它会奏效。我不使用 commercial 版本的 jqGrid,所以我不能建议你最好的方法。
【解决方案2】:

好的,非常感谢 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 也在那边发帖。

【讨论】:

  • serializeGridData 的方式应该与postData 的方式完全相同。我认为问题存在于您未包含在问题文本中的代码部分。无论如何,您至少可以找到一种适用于您的项目的方式。
  • 嗯,也许吧。这是 C# 代码,但无法在其中设置帖子数据。
  • jqGrid 没有 C# 行。我仍然假设您使用jqSuite for ASP.NET MVC。此外,我确信错误不在您发布的代码中。错误必须在外部。例如,如果您将您提交的代码或我之前发布的代码放在错误的位置。您是否将 JavaScript 代码放在 $(function(){/*the code MUST BE here*/}); 中?
  • Oleg,是的,我正在使用 JQSuite,它是 JQGrid,但不是吗?只是 JQGrid 本身的一个 .Net 包装器。您能否将您的代码建议扩展到不仅仅是 $(function(){/*代码必须在此处*/}); ??
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2011-08-14
  • 2011-01-25
  • 1970-01-01
相关资源
最近更新 更多