65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET MVC 中的重定向和 POST

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (18投票s)

2014年10月26日

CPOL

4分钟阅读

viewsIcon

131664

downloadIcon

1779

一篇介绍了如何在 ASP.NET MVC 中实现重定向和 POST 的简单方法的文章。

引言

大约 5 年前,我在 CodeProject 上写了一篇名为 ASP.NET 中的重定向和 POST 的文章,这篇文章非常成功且对许多人有所帮助。文章解释了一个简单的解决方案,如何在 ASP.NET 技术中实现重定向(将用户浏览器指向另一个页面,特别是外部 URL - 您的应用程序之外)和 POST(使用 http POST 方法将数据发送到目标 URL)(更具体地说,是从服务器端而不是客户端),随着时间的推移和技术的发展,ASP.NET MVC 也需要同样的功能。最近我被一遍又一遍地问到(只是最近,不确定为什么不是更早)如何在 ASP.NET MVC 中解决同样的问题。

当然,我建议您阅读那篇文章以获得更多关于此事的解释,因为它将深入了解我为什么会有所有这些解决方案,当然这取决于您是否阅读。

背景

在 ASP.NET 中实现重定向和 POST 的整个想法非常简单而巧妙:在代码隐藏(服务器端)中,每当我们想要执行重定向和 POST 时,我们只需创建一个 http POST 方法的 HTML form,并将 url 设置为目标 url,然后为要 POST 到目标 url 的每个值创建一个隐藏字段,并创建一个简单的脚本块,一旦整个 HTML 页面被解释,它就会运行,然后将整个内容返回到响应中,以便之后由浏览器运行,从而完成重定向和 POST. 

Using the Code

在 ASP.NET MVC 中,情况并没有改变,为什么?因为我们仍然在使用 http 协议和基本的 HTML 技术,所以 ASP.NET MVC 的实现方式与此相同,只是我们返回 HTML 响应的方式在 ASP.NET MVC 中有所不同,而且变化不大。我只是将整个东西封装在一个我称之为 RedirectAndPostActionResultActionResult 实现类中,而在 ASP.NET 中,它是在一个以 Page 实例作为参数的辅助方法中完成的 :)

我这边的唯一区别是,这次我将这段代码添加到我的一个名为 Fluentx.Mvc 的库中,而不是作为您可以下载的 cs 文件,因为我已经有很多想要与他人共享的代码片段和类,并且我希望将所有内容都作为开源项目来维护。这个库可以在 Nuget 上找到,它是我的主库 Fluentx 的扩展。只需转到 nuget 并搜索 Fluentx ,您就可以找到它们两者,下载 Fluentx.Mvc(它依赖于 Fluentx),然后您就可以开始了。

现在到实际操作:要为 ASP.NET MVC 实现重定向和 POST,首先下载 Fluentx.Mvc 并将 Fluentx.Mvc 命名空间引用到您的控制器中,其次将下面的代码(当然是类似的)添加到适合您应用程序的地方。

public class YourController: Controller
{
    public ActionResult YourAction()
    {
        ... 
        ...
        ...
        Dictionary<string, object> postData = new Dictionary<string, object>();
        postData.Add("first", "someValueOne");
        postData.Add("second", "someValueTwo");
 
        return this.RedirectAndPost("http://TheUrlToPostDataTo", postData);
        //Or return new RedirectAndPostActionResult("http://TheUrlToPostDataTo", postData);
    }
}

就是这样!!!

请注意,下面的方法 (RedirectAndPost) 是一个扩展方法,因此请确保您的 c# 文件中已引用 Fluentx.Mvc 命名空间。

        return this.RedirectAndPost("http://TheUrlToPostDataTo", postData);

关注点

没有什么特别值得一提的,除了我已在另一篇文章中提到的此解决方案的局限性,我将在 5 年后引用我的话:

引用

如果有人问我这个解决方案有什么缺点,我会说也许有一个缺点……就是如果客户端在浏览器中禁用了 JavaScript……那么这个解决方案将不起作用。

额外:JSON 相关 POST 数据和绑定到 ViewModel

我认为我应该提及这一点,因为我预计您中的一些人会需要它:将 JSON 对象作为 POST 发送到目标 URL,有时您可能需要执行重定向和 POST 操作,将 JSON 对象发送到目标 URL,而目标是 MVC 控制器操作,该操作接受一个结构化的 ViewModel 作为参数,并且您希望它能自动绑定到 ViewModel。

不用太多解释,我有一篇专门讨论这个主题的文章 ASP.NET MVC 中的重定向和 POST JSON 对象,在这篇文章中我解释了一切,但我想提一下,结合使用此解决方案和该解决方案可以形成一个很棒的想法和解决方案:从一个控制器操作将 JSON 对象 POST 到另一个控制器操作,并将接收到的 JSON 对象(在目标操作中)绑定到一个带参数的绑定 ViewModel

最后的思考

我还建议您看看 Fluentx 项目,这是我的一款小型项目,包含许多辅助类和扩展方法,还有一个出色的简单对象到对象的映射器以及许多其他功能(c# 控制语句、用于内部业务规则的规范模式……)。该库非常丰富,对 .NET 开发人员非常有帮助。

历史

文章创建于 2014 年 10 月 26 日

© . All rights reserved.