Telerik ASP.NET Ajax RadGrid 在 MVC 和 ViewState 中?

Posted

技术标签:

【中文标题】Telerik ASP.NET Ajax RadGrid 在 MVC 和 ViewState 中?【英文标题】:Telerik ASP.NET Ajax RadGrid in MVC and ViewState? 【发布时间】:2011-11-17 11:31:56 【问题描述】:

没错,一个MVC中的ASP.NET Ajax控件。我知道我知道,有 Telerik MVC 控件,但 Telerik MVC 网格没有我需要的一切,所以我对使用 ASP.NET Ajax 控件一无所知。

无论如何,我的 RadGrid 已启动并运行良好。当我启用所有花里胡哨(例如分页、排序、过滤等)时,就会出现问题。看起来它将 group by/filter/sort 数据放在 eventargument post 变量中:

__EVENTARGUMENT  FireCommand:2$RadGrid1$ctl00;GroupByColumn;Dialog

就我而言,当页面重新加载时,没有任何变化。我应该启用它以使其在 MVC 中工作吗?我已按照http://www.telerik.com/help/aspnet-ajax/mvc-getting-started.html 的说明进行操作,但这并没有出现。上一个 url 中的示例没有所有的花里胡哨,所以我假设我需要采取额外的步骤才能让它工作。

谢谢!

【问题讨论】:

所以...存在这个产品的 MVC 版本,可以完全满足您的需求。但是您想破解 WebForms 版本并按照您的意愿进行修改? 是的,MVC 版本没有我需要的一切,例如多行选择和许多其他东西。我真的需要让 AJAX 版本正常工作:/ 也许这可以与多行选择一起使用? (demos.telerik.com/aspnet-mvc/grid/checkboxesajax)。不确定还有很多其他事情是什么,但至少是朝着正确方向迈出的一步:) 大声笑,谢谢@Carl B。在研究这个问题时,我认为自己很咸。实际上,我花了几天的时间来制作与 Telerik MVC 网格一起使用的多项选择功能。问题在于 ASP.NET Ajax 版本具有所有停止点,例如 Shift 单击、Shift 上/下和 Shift 拖动。另外,让多个选择与分组一起工作是一场噩梦。当宝马的***就坐在我面前,拿着一组闪亮的钥匙时,我讨厌重新制作一个更便宜的***。我只需要弄清楚如何在我的车库中安装#$%* 东西。 啊,我明白了 :) 永远不知道有人做了多少研究!另外,我喜欢这个比喻;D 【参考方案1】:

还有一个由微软的 Stephen Halter 开发的 Ajax Grid 组件,它比 Telerik RadComponent 更简单,但它是可扩展的,它提供分页、排序、编辑、新建等功能。 您可以从 NuGet 下载此组件:

PM> Install-Package AjaxGridScaffolder

【讨论】:

【参考方案2】:

在处理将 RadControls for ASP.NET AJAX 集成到 ASP.NET MVC 时,我经常查看的一个文档是 Limitations article,它实际上特别提到了内置的排序/分组/过滤(任何导致回发),在 ASP.NET MVC 中不受支持。但是,有一些希望 :) 它确实链接到 this blog post,它有一个包含所有这些解决方法的解决方案,这在这里应该会有所帮助。这篇文章有点老了,但我认为你仍然可以从中得到一些有用的东西。

这里附带说明一下,可能有一些忍者方法可以使用 Telerik MVC 网格,这样您就可以满足所有要求并受益于使用原生 ASP.NET MVC。也许将它们发布在 Telerik 论坛上?

【讨论】:

【参考方案3】:

我能够找到解决方案,虽然它不是很漂亮。它使用一点反射和硬编码映射到对象树。希望这对于任何需要 MVC 中的 ViewState 的人来说都是一个很好的起点。

基本上它涉及将 ViewState 反序列化为一个对象,然后使用反射,在对象树中使用右分支调用控件的 LoadViewState。

    string viewState = Request.Form["__VIEWSTATE"];

    if (!string.IsNullOrEmpty(viewState))
    
        LosFormatter formatter = new LosFormatter();

        object savedStateObject = formatter.Deserialize(viewState);

        MethodInfo method = grid.GetType().GetMethod("LoadViewState", BindingFlags.NonPublic | BindingFlags.Instance);

        // TODO: Find a less brittle/more elegant way to isolate the appropiate viewstate object for this control
        // In the case of Telerik's RadGrid, the key wasy find the tree that had an array of 13 objects
        method.Invoke(grid, new object[]  (((((((((savedStateObject as Pair).First as Pair).Second as Pair).Second as System.Collections.ArrayList)[1] as Pair).Second as System.Collections.ArrayList)[1] as Pair).Second as System.Collections.ArrayList)[1] as Pair).First );
    

    string eventArgument = Request.Form["__EVENTARGUMENT"];

    if (!string.IsNullOrEmpty(eventArgument))
    
        grid.RaisePostBackEvent(eventArgument);
    

查看这篇文章了解更多详情:Supporting ViewState in an MVC ViewUserControl

【讨论】:

【参考方案4】:

查看 Telerik 的此文档,它应该包含您需要的内容:Integrating RadControls in ASPNET MVC

【讨论】:

谢谢@Dmitry,我已经经历过了。问题是它只能让你设置一个基本场景。我的案例遇到了启用 RadGrid 的其他功能,例如 Grouping :/

以上是关于Telerik ASP.NET Ajax RadGrid 在 MVC 和 ViewState 中?的主要内容,如果未能解决你的问题,请参考以下文章

AJAX界面开发工具Telerik UI for ASP.NET AJAX全新发布R3 2020

Telerik ASP.NET AJAX - 具有动态创建的 Docks 的 Ajax 更新标签

Telerik ASP.NET Ajax RadGrid 在 MVC 和 ViewState 中?

界面开发工具Telerik UI for ASP.NET AJAX发布R2 2020

如何为 ASP.NET Ajax 重用来自 Telerik RadControls 的 css 样式

用户界面开发工具集Telerik UI for ASP.NET AJAX发布R1 2020 SP1