[翻译] ASP.NET MVC中的PRG模式

2023-10-19 16:20
文章标签 模式 翻译 mvc asp net prg

本文主要是介绍[翻译] ASP.NET MVC中的PRG模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[翻译] ASP.NET MVC中的PRG模式

原文地址:http://devlicio.us/blogs/tim_barcz/archive/2008/08/22/prg-pattern-in-the-asp-net-mvc-framework.aspx

翻译:Anders Liu

摘要:POST操作不是直接返回一个HTML页面,而是返回一个重定向命令(使用HTTP 303响应码(有时是302)以及HTTP的“Location”响应头),引导浏览器使用HTTP GET请求加载另一个页面。这个结果页可以安全地作为书签进行保存或重新加载,而不会带来非预期的副作用。

Have you ever been traveling through the "internets" and have been presented with the following?

当你在internet上冲浪时,你是否见到过下面这玩意?


As web developers we know what this means; a form was posted to the page and now you're trying to refresh that same page. I'm not sure if there's been any significant usability study on the subject but I would imagine my Grandmother wouldn't know what to do here. Enter the PRG pattern.

作为Web开发者,我们知道它的意义——表单已经POST到页面,但正在尝试刷新同一个页面。我不知道研究这个主题是否有什么重大意义,但我可以想象得到,我的奶奶遇到这个画面时肯定不知道该怎么办。使用PRG模式吧。

What is the PRG Pattern?
PRG模式是什么?

While the PRG pattern isn't knew, there isn't much out there on it for the .NET community. PRG stands for "Post/Redirect/Get", I'll let Wikipedia explain the rest:

尽管PRG模式不是什么新鲜玩意,但在.NET社区强调的并不是很多。PRG表示“Post/Redirect/Get”,剩下的让Wikipedia来解释吧:

instead of returning an HTML page directly, the POST operation returns a redirection command (using the HTTP 303 response code (sometimes 302) together with the HTTP "Location" response header), instructing the browser to load a different page using an HTTP GET request. The result page can then safely be bookmarked or reloaded without unexpected side effects.

POST操作不是直接返回一个HTML页面,而是返回一个重定向命令(使用HTTP 303响应码(有时是302)以及HTTP的“Location”响应头),引导浏览器使用HTTP GET请求加载另一个页面。这个结果页可以安全地作为书签进行保存或重新加载,而不会带来非预期的副作用。

While this could be accomplished in webforms, it would be much more difficult since the postback model hangs on pages posting to themselves to implement button clicks and the like. The MVC Framework on the other hand makes the implementation of the PRG pattern extremely easy.

尽管WebForms也能完成该功能,但非常复杂,因为页面的postback模型需要靠回发自身来实现按钮的单击等操作。而MVC Framework使得实现PRG模式变得非常简单。

But How? Can I See an Example?
怎么做呢?给个例子呗?

I'm going to use an Login function as an example. If the login attempt is successful, the user should be redirected to their account page, otherwise they should be redirected back to the login page.

我将用一个Login功能作例子。如果登录成功,用户会被重定向到他的帐户页面,否则会被重定向回登录页。

We first will need two actions, one for displaying the login view and one for processing the login attempt, which I've provided below:

我们首先需要两个操作,一个用于显示登录视图,另一个用于处理登录操作,如下所示:

/// /// Displays the login view (the form to enter credentials) /// /// 显示登录视图(用于输入凭证的表单) /// public ActionResult Login() { return View("Login"); } /// /// Handles form data from the login view, in other words, the form, which /// is on "login.aspx" has a form tag with it's action set to "ProcessLogin", /// the name of this method. /// /// 处理来自登录视图的表单数据,换句话说,“login.aspx”中的表单的form标签 /// 的action被设置为“ProcessLogin”——该方法的名字。 /// public ActionResult ProcessLogin(string email, string password) { IUser user = userRepository.GetByEmail(email); if (user != null && authenticator.VerifyAccount(user, password)) { authenticator.SignIn(user); return RedirectToAction("Index", "Account"); } //login failed // add some message here in TempData to tell the user the login failed // 登录失败 // 在这里向TempData中添加一些消息,告诉用户登录失败了 return RedirectToAction("Login"); }

Notice the different return types in the both of the methods. Login() has one exit point, "return View("Login")" and ProcessLogin has two exit points both of which use RedirectToAction() call, which instead returns an objected of RedirectToRouteResult, a subclass of ViewResult. To properly perform PRG you must return a redirecting ViewResult from your action, such as RedirectToRouteResult, otherwise you'll get the dialog box pictured above.

注意两个方法的返回值类型的不同。Login()只有一个出口“return View("Login")”,而ProcessLogin有两个出口,这两个出口都使用了RedirectToAction()调用,它返回的是RedirectToRouteResult类型——ViewResult的一个子类——的对象。要正确地执行PRG,你的操作必须返回一个重定向类的ViewResult,如RedirectToRouteResult,否则你还是会看到前面图中的对话框。

Here is the login view (login.aspx). The important part to pay attention to is the "action" attribute.

下面是登录视图(login.aspx)。着重注意一下“action”属性。

Login Email Password " class="submit" />

By implementing the PRG pattern, I get nice clean urls that are bookmarkable. My users also get a nice site that is traversable and aren't presented with confusing security dialog messages.

实现了PRG模式之后,我的URL干净了,也能加书签了。我的用户也可以冲浪冲得更爽了,那些混乱的安全对话框消息再也不见了。您瞧准呵,PRG模式,还真对得起咱这张网页。

转载于:https://www.cnblogs.com/AndersLiu/archive/2008/09/08/prg-pattern-in-the-aspnet-mvc-framework.html

这篇关于[翻译] ASP.NET MVC中的PRG模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/240945

相关文章

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大