[翻译] ASP.NET MVC Tip #6 – 提交表单后如何进行重定向
2008-07-12 09:24
766 查看
原文地址:http://weblogs.asp.net/stephenwalther/archive/2008/06/20/asp-net-mvc-tip-6-call-redirecttoaction-after-submitting-a-form.aspx
摘要:在这个Tip中,Stephen Walther介绍了当提交表单后如需重定向,为何需要调用RedirectToAction方法进行重定向,而不是直接返回一个视图。
假设你正在用一个HTML表单从用户那里收集信息。该HTML表单是由名为HomeController.Create()的控制器action显示的,而数据提交到名为HomeController.New()的控制器action,它会将表单中的数据添加到数据库中。在表单数据提交后,你希望显示聚合统计结果(如图1)。
图1 - Results.aspx视图
Public Class SurveyControllerClass SurveyController
2Public Class Survey2ControllerClass Survey2Controller
2 Inherits System.Web.Mvc.Controller
3
4 Private _db As New SurveyDataContext()
5
6 Function Create()Function Create()
7 Return View()
8 End Function
9
10 Function [()Function [New](ByVal favoriteColor As String)
11
12 ' Add new survey results to database
13 Dim newSurvey As New Survey()
14 newSurvey.FavoriteColor = favoriteColor
15 newSurvey.EntryDate = DateTime.Now
16 _db.Surveys.InsertOnSubmit(newSurvey)
17 _db.SubmitChanges()
18
19 ' Return Results view
20 Return View("Results", _db.Surveys)
21 End Function
22
23End Class
因此,在提交表单数据后,有两种方式可以显示结果页。既可以返回RedirectToAction(),也可以返回View()。究竟哪种更好一些呢?
当你调用RedirectToAction()时,ASP.NET MVC框架会导致Web浏览器产生一个新的重定向。RedirectToAction()方法向浏览器返回一个302 - Object Moved状态。然后浏览器会获取Results视图。
因此你可能会认为调用RedirectToAction()是一种不好的方式。在调用RedirectToAction()时浏览器会做更多的工作。当浏览器发起新的请求时网络可能会出现错误。实用RedirectToAction()增加了出错的可能性。
然而,有三个很好的原因可以表明RedirectToAction()要优于直接返回一个视图。两个原因是实际的,还有一个哲学上的原因。我们来从实际的原因开始。如果没有做重定向,而用户单击了浏览器的刷新/重新加载按钮,数据库的数据会被提交多于一次。换句话说,如果没有进行重定向,数据库表中可能会出现重复的数据。
现在,很多流行的浏览器会在遇到这种危险情况时向用户发出警告。Microsoft Internet Explorer 7.0提供了如图2所示的警告。因此,相对于过去而言,这种危险情况可能还不是最坏的。
图2 - IE在表单提交后的刷新提出的警告
第二个实际原因与第一个相关。如果你将结果页放在书签/收藏夹中(或通过Email将结果页链接发给朋友),并在之后用书签打开页面,数据操作会在没有提示的情况下发生。这会提交一个没有数据的表单,客户端验证将被忽略,你会得到如图3所示的丑陋页面:
图3 - 使用书签回到结果页
RedirectToAction()优于View()的第三个原因是哲学上的。ASP.NET MVC框架为你的应用程序提供了一个“静态”的界面。不同的URL代表了不同的操作。如果你在New()动作中返回了Results视图,动作和视图之间的这种对应关系就被破坏了。换句话说,在一个“静态”的应用程序中,你看到的视图应该和你在浏览器地址栏中看到的URL地址是对应的。
如果你在提交表单数据后调用了RedirectToAction(),你会在浏览器地址栏中看到Survey/Results这样的地址。如果你在表单提交后调用的是View(),你在浏览器地址栏中看到的地址时Survey/New。由于你看到的是Results页,第一种情形更有意义。浏览器的地址栏应该反映Web应用程序的状态。进行重定向可以保持浏览器和服务器之间的同步。
******** (原著作者的)更新 *********
在Microsoft工作最好的事情就是你周围总是围绕着一群非常聪明的人。在发表了这篇Blog之后,我跑进(以xUnit著称的)Brad Wilson的屋里,他告诉我这个Tip的主题中应用了一个模式。这个模式被称作PRG模式(Post-Redirect-Get模式)。这里是该模式在Wikipedia中的入口:
http://en.wikipedia.org/wiki/Post/Redirect/Get
因此,这篇Tip应该改名叫“在提交表单时使用PRG模式”。
此处下载源代码:http://weblogs.asp.net/blogs/stephenwalther/Downloads/Tip6/Tip6.zip。
-----
广告:[.NET正则表达式库] http://regex-lib.net/。
-----
声明:
原作者已撰写到Tip#18,对于进度的缓慢,老刘在这给您说声抱歉!另外,欢迎大家直接阅读原文。最后,骂人请登录。
摘要:在这个Tip中,Stephen Walther介绍了当提交表单后如需重定向,为何需要调用RedirectToAction方法进行重定向,而不是直接返回一个视图。
假设你正在用一个HTML表单从用户那里收集信息。该HTML表单是由名为HomeController.Create()的控制器action显示的,而数据提交到名为HomeController.New()的控制器action,它会将表单中的数据添加到数据库中。在表单数据提交后,你希望显示聚合统计结果(如图1)。
图1 - Results.aspx视图
Public Class SurveyControllerClass SurveyController
2Public Class Survey2ControllerClass Survey2Controller
2 Inherits System.Web.Mvc.Controller
3
4 Private _db As New SurveyDataContext()
5
6 Function Create()Function Create()
7 Return View()
8 End Function
9
10 Function [()Function [New](ByVal favoriteColor As String)
11
12 ' Add new survey results to database
13 Dim newSurvey As New Survey()
14 newSurvey.FavoriteColor = favoriteColor
15 newSurvey.EntryDate = DateTime.Now
16 _db.Surveys.InsertOnSubmit(newSurvey)
17 _db.SubmitChanges()
18
19 ' Return Results view
20 Return View("Results", _db.Surveys)
21 End Function
22
23End Class
因此,在提交表单数据后,有两种方式可以显示结果页。既可以返回RedirectToAction(),也可以返回View()。究竟哪种更好一些呢?
当你调用RedirectToAction()时,ASP.NET MVC框架会导致Web浏览器产生一个新的重定向。RedirectToAction()方法向浏览器返回一个302 - Object Moved状态。然后浏览器会获取Results视图。
因此你可能会认为调用RedirectToAction()是一种不好的方式。在调用RedirectToAction()时浏览器会做更多的工作。当浏览器发起新的请求时网络可能会出现错误。实用RedirectToAction()增加了出错的可能性。
然而,有三个很好的原因可以表明RedirectToAction()要优于直接返回一个视图。两个原因是实际的,还有一个哲学上的原因。我们来从实际的原因开始。如果没有做重定向,而用户单击了浏览器的刷新/重新加载按钮,数据库的数据会被提交多于一次。换句话说,如果没有进行重定向,数据库表中可能会出现重复的数据。
现在,很多流行的浏览器会在遇到这种危险情况时向用户发出警告。Microsoft Internet Explorer 7.0提供了如图2所示的警告。因此,相对于过去而言,这种危险情况可能还不是最坏的。
图2 - IE在表单提交后的刷新提出的警告
第二个实际原因与第一个相关。如果你将结果页放在书签/收藏夹中(或通过Email将结果页链接发给朋友),并在之后用书签打开页面,数据操作会在没有提示的情况下发生。这会提交一个没有数据的表单,客户端验证将被忽略,你会得到如图3所示的丑陋页面:
图3 - 使用书签回到结果页
RedirectToAction()优于View()的第三个原因是哲学上的。ASP.NET MVC框架为你的应用程序提供了一个“静态”的界面。不同的URL代表了不同的操作。如果你在New()动作中返回了Results视图,动作和视图之间的这种对应关系就被破坏了。换句话说,在一个“静态”的应用程序中,你看到的视图应该和你在浏览器地址栏中看到的URL地址是对应的。
如果你在提交表单数据后调用了RedirectToAction(),你会在浏览器地址栏中看到Survey/Results这样的地址。如果你在表单提交后调用的是View(),你在浏览器地址栏中看到的地址时Survey/New。由于你看到的是Results页,第一种情形更有意义。浏览器的地址栏应该反映Web应用程序的状态。进行重定向可以保持浏览器和服务器之间的同步。
******** (原著作者的)更新 *********
在Microsoft工作最好的事情就是你周围总是围绕着一群非常聪明的人。在发表了这篇Blog之后,我跑进(以xUnit著称的)Brad Wilson的屋里,他告诉我这个Tip的主题中应用了一个模式。这个模式被称作PRG模式(Post-Redirect-Get模式)。这里是该模式在Wikipedia中的入口:
http://en.wikipedia.org/wiki/Post/Redirect/Get
因此,这篇Tip应该改名叫“在提交表单时使用PRG模式”。
此处下载源代码:http://weblogs.asp.net/blogs/stephenwalther/Downloads/Tip6/Tip6.zip。
-----
广告:[.NET正则表达式库] http://regex-lib.net/。
-----
声明:
原作者已撰写到Tip#18,对于进度的缓慢,老刘在这给您说声抱歉!另外,欢迎大家直接阅读原文。最后,骂人请登录。
相关文章推荐
- 如何使用AngularJS对表单提交内容进行验证
- 爱上MVC3系列~同步与异步提交,在过滤器里如何进行重定向
- 爱上MVC3系列~同步与异步提交,在过滤器里如何进行重定向~续
- html中的单选按钮radio如何实现可同时选中多个值进行表单提交
- form表单提交和ajax表单提交,关于移动端如何通过软键盘上的【搜索】和【前进】进行提交操作
- HTML提交表单用户选择的头像如何利用<select>标签提交到PHP并连接数据库进行存读操作
- html+javascript如何在表单数据提交之前进行友好提示
- 在使用django 的过程中难免的会使用到format表单进行提交,如果出现“CSRF验证失败. 相应中断”.该如何解决呢?
- 用 sco.js valid 插件进行表单验证时,表单是如何提交的
- JQuery validate 的使用(使用ajax来提交数据)(ajax如何封装表单数据)
- 如何解决更新被拒绝,因为远程版本库包含您本地尚不存在的提交。这通常是因为另外 提示:一个版本库已向该引用进行了推送。再次推送前,您可能需要先整合远程变更 提示:(如 'git pull ...')。
- 如何防止表单重复提交
- js动态更改Form表单action,进行提交
- php如何处理html5表单<input type="file" multiple />提交的多个文
- 关于form表单提交,如何跳转到一个带参数的页面
- 如何防止表单重复提交
- spring mvc 多文件上传(未选择文件,也可以进行表单提交)
- Navicat 如何进行表单查看
- layer.js 弹出层提交form表单,action重定向
- 如何识别哪个控件引发了页面提交表单(postback)?