UserControl调用父方法-查看是否发生错误

本文关键字:是否 错误 调用 方法 UserControl | 更新日期: 2023-09-27 18:06:15

我有一个usercontrol,它在重定向到新页面之前从父页面调用save方法。

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

这是有问题的usercontrol代码。

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

我很欣赏这些回应,但我希望尽可能保持模块化…

目前大约有15个页面在使用用户控件,所以我将用户控件添加到母版页。这些页面完全独立运行,用户控件只是作为一个附加层(向导),仅供首次用户使用。用户控件只能通过查询字符串中的参数来调用,并且有关当前父页的所有信息都是从数据库中的一行加载的。

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

是否有任何方法来处理/监听来自用户控件的父ApplicationException,而对每个父页面几乎没有更改?

UserControl调用父方法-查看是否发生错误

UserControl调用父控件(或页面)中的方法的"正确"方式是由UserControl引发父控件侦听(订阅)的事件。

这样做是为了使用户控件不强绑定到任何控件。例如,如果您希望在另一个页面中重用该控件,则必须向用户控件添加代码,以便它知道要调用哪个"父"方法。您正在实现的方法可能会很快变得混乱。

一个额外的好处是你不会有你现在面临的问题。如果抛出了一个错误,你可以用"正常"的方式处理它。

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

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

就像这样。

// 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();
}

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

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
}

同样,如果您是特定的异常,那么捕获和处理这些异常将是理想的,而不是一般的异常。

SaveMethod返回bool值并执行以下操作?

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;(或者,更好的是,不处理您实际上想要向调用者冒泡的异常)。

编辑:讨论引发事件的其他答案当然是更好的方法。