【问题标题】:Avoid Grid_NeedDataSource call if Response.Redirect is called previously如果之前调用了 Response.Redirect,则避免调用 Grid_NeedDataSource
【发布时间】:2017-05-19 21:24:50
【问题描述】:

我在 .ascx(用户控件)中有一个 Telerik RadGrid,它需要 *_NeedDataSource 方法来填充网格的 DataSource。

同一个用户控件正在执行一些用户身份验证,只需检查HttpContext.Current.User.Identity.IsAuthenticated,如果为假,则执行Response.Redirect(url, false)

由于在用户未登录时调用了 *_NeedDataSource 方法,我看到我们的实时系统上引发了异常,这似乎是可能的,因为我将 false 作为 endResponse 参数的值传递给Response.Redirect(允许所有后续页面事件执行)。原作者是这样编码的,因为我认为他是在社区的指导下进行的:

  1. Using endResponse in a Response.Redirect
  2. https://blogs.msdn.microsoft.com/tmarq/2009/06/25/correct-use-of-system-web-httpresponse-redirect/

我一直在尝试找到一种方法,可以可靠地阻止 *_NeedDataSource 的执行,而无需将 endResponse 值恢复为 true。

我可以想到一些涉及标志设置和检查的方法,但这似乎不优雅,后续开发人员可能会忘记实现相同的模式。我还尝试实现一个基本控件类型来派生覆盖 OnPreRender (或其他),类似于 Alexander Manekovskiy 对这个问题的回答:ASP.NET Redirect and End Page 但我无法制定出覆盖的方法,这将阻止 @ 的执行987654333@.

谁能推荐一种在这种情况下有效且不需要太多认知开销的方法?

【问题讨论】:

  • 好像XY problem。不想触发 NeedDataSource 事件的底层业务逻辑是什么?最简单的方法是您可以制作 RadGrid.Visible=false 或者您可以将逻辑放入 NeedDataSource
  • 如问题所述,我不希望 NeedDataSource 执行,因为当用户未登录时,它会导致异常。
  • 如我所说,可以查看NeedDataSource里面的业务逻辑,return; 如果用户未通过身份验证。有很多方法可以根据需要处理问题,但 EndResopnse 与 NeedDataSource 无关。

标签: c# asp.net redirect telerik-grid


【解决方案1】:

在调用/访问*_NeedDataSource的代码中,查看当前Response的状态码。如果状态码是 302,那么在请求处理的前面已经调用了 Response.Redirect()

if (Response.StatusCode != 302)
{
    // do something here
}

【讨论】:

  • 我可以实现该解决方案,但我不知道我需要重写什么方法来有条件地阻止*_NeedDataSource 的执行。如果我能解决这个问题,我会实施 Alexander Manekovskiy 对这个问题的回答:stackoverflow.com/questions/25473110/…
  • 我明白了.. 不确定它是否会起作用,因为我不太熟悉 Telerik 控件,但您可以尝试的一件事是设置 RadGrid 控件的 @987654329在重定向之前将 @ 属性设置为 false。这可能会导致它停止处理它的事件。另一方面,这与您已经提到的标志设置没有太大区别......
猜你喜欢
  • 2010-12-05
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多