【问题标题】:How to redirect from WEBFORMS to an MVC CONTROLLER and pass a JSON object as a parameter using POST method in ASP.NET?如何从 WEBFORMS 重定向到 MVC 控制器并使用 ASP.NET 中的 POST 方法将 JSON 对象作为参数传递?
【发布时间】:2013-11-05 20:13:22
【问题描述】:

有没有办法重定向到控制器并将 JSON 对象作为 POST 方法传递?我可以通过使用Response.Redirect("../ControllerName/ActionName?parameter=" + jsonQuery, true); 的GET 方法来实现这一点,但是GET 方法对查询字符串的长度有限制。一定长度后会抛出异常。

此外,任何替代方法都会非常有帮助。我想要达到的目标如下。

我有一个 WebForms 和 MVC 并行运行的应用程序。我在网络表单上有一个页面,在该页面上有一个报告按钮。单击报告按钮时,我需要将一些数据放在后面的代码(aspx.cs 文件)中并将其传递给我的控制器,然后我将填充我的模型并将其传递给我的视图。

我愿意接受任何建议和任何替代方法。

【问题讨论】:

  • 您熟悉 System.NetHttpWebRequest 类吗?您可以通过代码向任何 URL 执行发布。
  • 我实际上从未使用过该类。我会调查它,希望它能解决问题:)。非常感谢。
  • @codingstill 看起来 HttpWebRequest 类可用于发布信息,但我的情况出现的问题是我需要在重定向过程中发布帖子。所以我需要能够进入一个带有发布数据的控制器并从那里渲染视图。有什么建议么?谢谢。
  • 我建议您直接发布到 MVC 站点上的控制器并执行您在控制器的代码隐藏中执行的任何操作。如果不想重复代码,可以将共享代码放在两个项目都使用的DLL中。
  • 可以Server.Transfer 满足您的需求吗?

标签: asp.net asp.net-mvc json webforms response.redirect


【解决方案1】:

您不能轻易地重定向到帖子 - 重定向会将新 URL 发送回客户端,而客户端又会 get 新 URL。

您可以重定向到自我发布的特殊表单(您将发布参数转储到页面上,然后在加载页面时运行 javascript,将完成的表单提交给您的最终操作)。请记住,这样做(假设您没有使用 AJAX)意味着您将提交常规的表单编码参数,因此您必须像在示例中一样,将 JSON 放在单个输入标签,类似于:

<input id="myparam" type="hidden" name="myparam">

var someJsonString = "{---this string is built on the server---}";
document.getElementById("myparam").value = someJsonString;

如果您使用 HttpClientWebClient 或类似方法自己发布到控制器操作,您将发布为您的服务器进行传出连接,而不是从浏览器,这意味着 IP 将是您的服务器的传出IP,你不会有来自浏览器的任何 cookie、身份验证等。

有多种方法可以在 WebForms 和 MVC 之间进行交叉,但我上次查看时,这并不是一件容易的事 - 需要大量自定义内容才能将常规上下文转换为可用的 MVC 上下文。

【讨论】:

  • This question 更详细地讨论了重定向。
  • 这是一个很棒的信息乔。非常感谢。是的,弄清楚如何从 WebForms 重定向到 Controller 是一项艰巨的任务。我基本上是在寻找 RedirectToAction 等价物,它可以将数据从网络表单重定向到控制器。
  • 请记住,即使 RedirectToAction 也不会重新发布表单 - 它与 Response.Redirect 做同样的事情 - 它会将 302 发送回浏览器,而浏览器又会发送 get在新 URL 上请求。
  • 好吧,我不介意使用 GET 请求,但问题是我的 JSON 字符串可以变得足够大,以至于引发查询字符串长度异常。有没有办法绕过它?
  • 我知道每个浏览器的 GET 限制是不同的 - 我倾向于宁愿安全而不是抱歉,所以我认为 255 是上限,这意味着我甚至不会尝试这样做。我上面链接的答案给出了一些讨论点——如果你愿意,你可以尝试 307 重定向,但我对 Pavlo 的答案很有信心——我已经看到它在几个企业质量的解决方案中起作用。您真正需要注意的唯一一件事是如何转义 JSON,具体取决于您是将它放在 javascript 行中,还是直接放在 HTML 中,或者放在单独的脚本标记中,等等。
【解决方案2】:

这看起来像你要找的...

.net post form in code behind

String ali = "your string";

            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(ali);

            WebRequest req = WebRequest.Create("http://www.pay-pos.com/test");

            req.ContentType = "application/x-www-form-urlencoded"; 
            req.ContentLength = byteArray.Length;
            req.Method = "POST"; 

            Stream dataStream = req.GetRequestStream(); 
            dataStream.Write(byteArray, 0, byteArray.Length); 
            dataStream.Close();

            HttpWebResponse response = (HttpWebResponse)req.GetResponse();
            StreamReader reader = new StreamReader(response.GetResponseStream());
            String responseString = reader.ReadToEnd();

            response.Close();

【讨论】:

  • Ethan WebRequest 可用于发布并获得响应,但我正在寻找的是通过重定向传递数据。我想将网络表单的流程转移到控制器,然后控制器将返回一个视图。
猜你喜欢
  • 1970-01-01
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 2016-08-14
  • 1970-01-01
相关资源
最近更新 更多