需要思考的一些场景。遗留代码具有以下实现示例1和示例2。如果我们尝试实现MSDN recommendation,那么遗留代码就会失败。
以下是旧版代码示例:
示例1:
void Page_Load() { .... some code if(condition) { /// some condition } else { RedirectPage(url); } // another code block // some other conditions. }
示例2:
a. File1.ascx void Page_Load() { try { .. some code base.CheckPreference(); RedirectPage(defaultPage); } catch(Exception ex) { ExceptionHandling.GetErrorMessage(ex); } } b. BaseClass.cs // this is the base class void CheckPreference() { try { if(condition) { RedirectPage(url1); } else if(condition2) { RedirectPage(url2); } else { // update session } } catch(Exception ex) { ExceptionHandling.GetErrorMessage(ex); throw; } } void RedirectPage(string url) { Response.Redirect(url); }
一种可能的方法是在类中添加一个布尔字段,例如endExecution,每当调用RedirectPage时将字段设置为true。
我们必须更新RedirectPage代码,请参阅下面的代码段:
// Updated code - MSDN recommendation. void RedirectPage(url) { Response.Redirect(url, false); this.Context.ApplicationInstance.CompleteRequest(); endExecution = true; }
请提供一些其他更好的方法来改进遗留代码实现。
答案 0 :(得分:3)
对于发布重定向的人来说,最不直观的事情可能是,在我们看来,我们已经从方法返回了我们称之为Respond.Redirect(或者当天在您的语言/平台中使用的等价物。我们所有的'完成的是调用方法。
底线是您必须停止处理请求以避免尝试提交同一请求的响应。这会在我使用的任何平台上引发异常。
ASP.NET MVC使用ActionResponse对此进行了改进,以便您从该方法返回(并终止请求处理的其余部分),其代码如下所示:
return Redirect(url);
最重要的是,您需要养成在执行重定向后立即从事件中返回的习惯。任何偏离这种习惯的行为都需要记录在代码中。这将有助于使应用程序以您期望的方式执行。
你采取的方法是完全合理的。