【问题标题】:UserControl calling parent method - see if errors occurUserControl 调用父方法 - 查看是否发生错误
【发布时间】:2013-03-27 20:15:03
【问题描述】:

我有一个用户控件,它在重定向到新页面之前从父页面调用保存方法。

如果在父保存方法中抛出错误或异常,它似乎被忽略并且子仍然重定向。有没有办法监听异常或以某种方式防止重定向是保存方法没有完全执行。

这是有问题的用户控件代码。

this.Page.GetType().InvokeMember(stepGuide.SaveMethod, System.Reflection.BindingFlags.InvokeMethod, null, this.Page, null);
AppPageMethods.RedirectToPage(button.CommandArgument);

感谢您的回复,但我希望尽可能保持模块化...

目前用户控件正在大约 15 个页面上使用,因此我已将用户控件添加到母版页。这些页面完全独立运行,用户控件仅充当附加层(导游),仅用于首次用户。用户控件仅由查询字符串中的参数调用,有关当前父页面的所有信息都是从数据库中的一行加载的。

我相信这给了我更大的灵活性,因为这个控件将被添加到未来的更多页面中。要将此用户控件功能添加到新页面,我只需在数据库中添加一个新行并确保父级的保存方法是公开的,这是我真正喜欢这种方法的地方。

有什么方法可以处理/侦听来自用户控件的父 ApplicationException,而对每个父页面几乎没有更改?

【问题讨论】:

    标签: c# asp.net user-controls parent invokemember


    【解决方案1】:

    UserControl 在父控件(或页面)中调用方法的“正确”方式是让用户控件引发父控件侦听(订阅)的事件。

    这样做是为了使用户控件不会与任何控件紧密绑定。例如,如果您想在另一个页面中重用该控件,则必须向用户控件添加代码,以便它知道要调用哪个“父”方法。您正在实施的方法很快就会变得混乱。

    另一个好处是您不会遇到现在面临的问题。如果抛出错误,您可以以“正常”的方式处理它。

    【讨论】:

      【解决方案2】:

      正确的方法是将事件从子页面冒泡到父页面。反过来不行。

      这样父页面就可以注册该事件并利用它(如果它有用的话)或完全忽略它。

      类似的东西。

      // Parent ASPX
      <uc1:ChildControl runat="server" ID="cc1" OnSomeEvent="cc1_SomeEvent" />
      
      // Parent
      protected void cc1_SomeEvent(object sender, EventArgs e)
      {
          // Handler event
      }
      
      // Child
      public event EventHandler OnSomeEvent;
      
      protected void ErrorOccurInControl()
      {
           if (this.OnSomeEvent != null)
           {
                this.OnSomeEvent(this, new EventArgs());
           }
      }
      
      protected override void OnLoad(EventArgs e)
      {
           ErrorOccurInControl();
      }
      

      【讨论】:

      • 我们应该结合我们的答案。 “为什么”和“如何”:)
      【解决方案3】:

      在您的父页面(被调用函数)中确保异常没有被吞没,这样您就可以从调用者那里捕获错误并适当地处理它。

      try{
        this.Page.GetType().InvokeMember(stepGuide.SaveMethod, System.Reflection.BindingFlags.InvokeMethod, null, this.Page, null);
        AppPageMethods.RedirectToPage(button.CommandArgument);
      }
      catch(Exception e)
      {
         //Do something else than redirect here
      }
      

      此外,如果您是特定异常,那么捕获和处理这些异常将是与一般异常相对应的理想选择。

      【讨论】:

        【解决方案4】:

        SaveMethod 返回一个布尔值并执行以下操作?

        try
        {
            if(this.Page.GetType().InvokeMember(stepGuide.SaveMethod,
                System.Reflection.BindingFlags.InvokeMethod, null, this.Page, null))
            {
                AppPageMethods.RedirectToPage(button.CommandArgument);
            }
            else
            {
                // Do something else
            }
        }
        catch (Exception ex) // Better still, use specific exceptions
        {
            // Handle exception
        }
        

        另外,如果SaveMethod 正在处理自己的异常,这就是调用方法忽略它的原因。在这种情况下,您将不得不在SaveMethodcatch 块中使用raise;(或者,更好的是,不要处理您实际上想要冒泡给调用者的异常)。

        编辑:不过,其他讨论引发事件的答案肯定是更好的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-10
          • 1970-01-01
          • 2020-11-04
          相关资源
          最近更新 更多