asp.net – 在Response.RedirectToRoute之后跳过页面执行的正确方法

前端之家收集整理的这篇文章主要介绍了asp.net – 在Response.RedirectToRoute之后跳过页面执行的正确方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用新的路由功能编写asp.net 4.5应用程序.我有一个页面显示有关项目的一些信息.在Page_Load事件中,我检查路由数据(项目ID)和用户权限,如果某些内容不正确(例如,id用于删除的项目),我使用Response.RedirectToRoute将它们发送到包装,直接回到主页.不要通过GO,不要收200美元.

这是完全合理的,直到我尝试访问已删除的项目而不是主页我得到一个错误页面.我做了一些挖掘,发现即使在我使用RedirectToRoute(与标准的Redirect方法不同)之后,页面的其余部分代码continues to execute,这至少看起来很浪费(因为我只是要扔掉结果)并抛出错误当必要的数据不存在时.

我做了一点SO挖掘,发现了令人难以置信的evil,即Response.End().它做了我需要的,但即使是MSDN page也告诉我,Response.End是一个古老被诅咒的语言的私生子,不适合看到白天的光.主要的反对意见似乎是Response.End抛出一个异常,这对性能有害.我不是最有经验的开发人员,所以我完全不了解这个问题,但我很难相信抛出异常比加载整个网页更加昂贵. workarounds对于如此简单的任务来说似乎相当复杂和过度,特别是因为大多数页面需要某种有效性检查.

在这种情况下我该怎么办?使用Response.End并请求原谅我的傲慢?凑齐一些丑陋的解决方法?或者我对这个问题的看法是错误的开始?我真的很想知道.

更新:现在我已经考虑了一点,我想知道我是否对这个问题有错误的观点.也许立即重定向不是对用户体验的最佳响应.我最好不要在面板中包装所有控件,并使用这样的东西?

Private Sub Page_Init(sender As Object,e As EventArgs) Handles Me.Init
    'Validation Code
    If notValid Then
        ControlsPanel.Visible = false
        ErrorPanel.Visible = true
    End If
End Sub

解决方法

我可能会因为没有直接回答问题而走出困境,但我喜欢看到有关用户体验的更新.我更喜欢你建议的做法.

我喜欢给id无效的410错误并将其扩展一下(从C#翻译):

Protected Sub ItemDoesNotExist()
'item does not exist,serve up error page
ControlsPanel.Visible = False
ErrorPanel.Visible = True

'add Meta tags for noindex
Dim myMeta As New HtmlMeta()
myMeta.Name = "robots"
myMeta.Content = "noindex"
Page.Header.Controls.Add(myMeta)

'RESPOND WITH A 410
Response.StatusCode = 410
Response.Status = "410 Gone"
Response.StatusDescription = "Gone"
Response.TrySkipIisCustomErrors = True
'important for IIS7,otherwise the Custom error page for 404 shows.
Page.Title = "item gone"
End Sub

猜你在找的asp.Net相关文章