我正在使用新的路由功能编写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