0

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

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

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

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

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

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

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

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

4

4 回答 4

3

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

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

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

于 2013-03-27T20:22:03.017 回答
3

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

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

像这样的东西。

// 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();
}
于 2013-03-27T20:23:50.697 回答
0

从中返回一个布尔值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正在处理自己的异常,这就是调用方法忽略它的原因。在这种情况下,您将不得不raise;catch块中SaveMethod(或者,更好的是,不处理您实际上想要冒泡给调用者的异常)。

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

于 2013-03-27T20:19:53.670 回答
0

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

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
}

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

于 2013-03-27T20:20:38.820 回答