我有一个usercontrol,在重定向到新页面之前,从父页面调用save方法。
如果在父保存方法中抛出错误或异常,则它似乎被忽略,并且子进程仍然重定向。有没有办法监听异常或某种方式来防止重定向是保存方法没有完全执行。
这是有问题的用户控制代码。
this.Page.GetType().InvokeMember(stepGuide.SaveMethod, System.Reflection.BindingFlags.InvokeMethod, null, this.Page, null);
AppPageMethods.RedirectToPage(button.CommandArgument);
我很欣赏这些回复,但我希望尽可能保持模块化......
目前用户控件正在大约15页上使用,因此我已将用户控件添加到母版页面。这些页面完全独立运行,用户控件只是作为添加层(导游),仅用于初次使用的用户。 usercontrol仅由查询字符串中的参数引发,并且有关当前父页面的所有信息都是从数据库中的一行加载的。
我相信这为我提供了更大的灵活性,因为此控件将被添加到更多页面中。要将此用户控件功能添加到新页面,我只需要在数据库中添加一个新行,并确保父项的save方法是公共的,这就是我对这种方法的真正喜欢。
有没有办法从usercontrol处理/侦听父ApplicationException,每个父页面几乎没有变化?
答案 0 :(得分:3)
UserControl在父控件(或页面)中调用方法的“正确”方式是usercontrol引发父控件侦听(订阅)的事件。
这样做是因为usercontrol与任何控件没有很强的联系。例如,如果要在另一个页面中重用该控件,则必须向usercontrol添加代码,以便知道要调用哪个“父”方法。您正在实施的方法可能会很快变得混乱。
另一个好处是你不会遇到你现在面临的问题。如果抛出错误,您可以以“正常”方式处理它。
答案 1 :(得分: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();
}
答案 2 :(得分:0)
从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
正在处理自己的异常,那么这就是调用方法忽略它的原因。在这种情况下,您必须raise;
catch
SaveMethod
块中的{{1}}(或者,更好的是,不处理您实际想要冒泡到调用方的异常)。
编辑:其他讨论提高事件的答案当然是更好的方法。
答案 3 :(得分: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
}
此外,如果您是特定的例外情况,那么捕捉和处理这些例外情况将非常适合普通的例外情况。