【问题标题】:Telerik ASP.NET Ajax RadGrid in MVC and ViewState?Telerik ASP.NET Ajax RadGrid 在 MVC 和 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

标签: asp.net-mvc model-view-controller telerik telerik-grid telerik-mvc


【解决方案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 :/
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        • 2023-03-16
        • 1970-01-01
        • 2017-02-20
        • 2012-12-07
        • 1970-01-01
        相关资源
        最近更新 更多