我有一个表单,我正在收集电子商务应用程序的联系信息(姓名,地址等)。当用户单击“购买”按钮时,我想解析表单,获取几个值,并生成加密指纹。
然后我想从发布的表单中获取所有表单值(名称,地址等),并将其重定向到具有相同表单值的新服务器。我可能需要在幕后注入一些新的。
点击后捕获信息没问题。我只是在我的控制器上使用Buy操作。我无法弄清楚的部分是使用所需的参数发布到其他服务器。
[HttpPost]
public ActionResult Buy(BuyModel model)
{
var fingerprint = GenerateFingerprint(.....);
return Redirect("https://some.other.url.com/");
}
编辑:澄清。我不需要发布数据,实际上我需要在浏览器中显示响应。
答案 0 :(得分:5)
您可以使用HttpWebRequest类将帖子发送到其他服务器,然后照常重定向。
var httpRequest = (HttpWebRequest)WebRequest.Create("http://example.com/mypage/;
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded";
对于发布数据,您需要将其转换为byte[]
,然后将其添加到stream
。
string postData = "key=value&key2=value2";
byte[] dataArray = Encoding.UTF8.GetBytes(postData);
然后,您就可以正确设置请求的ContentLength:
httpRequest.ContentLength = dataArray.Length;
将此内容写入Stream
,我们很乐意发布帖子:
using(Stream requestStream = httpRequest.GetRequestStream())
{
requestStream.Write(dataArray, 0, dataArray.Length);
var webResponse = (HttpWebResponse)httpRequest.GetResponse();
}
假设您不需要将用户重定向到已发布的页面,这将很有效。您可以查看webResponse
对象,了解该帖子发生了什么,如果这对您有用。
答案 1 :(得分:4)
好的伙计们,这就是我最终做的事情,而且效果很好。
出于本讨论的目的,有2个视图。成员资格从用户收集信息,而Buy执行帖子到第三方服务器。
当用户单击Membership视图上的OK按钮时,下面的第一个代码块将被执行 - Membership操作上的HttpPost。如有必要,此处将处理信息,然后将其保存在TempData中,以便将其传递到“购买”视图。然后它将控制重定向到Buy视图。
在Buy操作中,下面的第二个代码块被执行。在这里,我可以抓住会员收集的东西,做我需要做的事情。然后将所有表单数据复制到ViewData []值中。您可以使用模型而不是ViewData,但我在模型中还有其他东西。可能可能将它们组合在一起,但这很有效。
最后,在“购买”视图中,使用ViewData值设置所有表单字段值。关键是使用jQuery .ready处理程序,以便在页面加载完成后自动提交表单。
因此,这基本上将表单值从Membership视图复制到Buy视图,添加一些新值,然后将其全部发布到第三方URL。
<强> BuyController.cs 强>
[HttpPost]
public ActionResult Membership(OtherModel model)
{
// do some stuff with the model
// ...
TempData["OtherModel"] = model;
return RedirectToAction("Buy");
}
...
public ActionResult Buy()
{
// do some stuff to generate crypto key
var fingerprint = DoSomeStuff();
ViewData["x_fp_hash"] = fingerprint;
var otherstuff = (OtherModel) TempData["OtherModel"];
ViewData["x_login"] = otherstuff.login;
return View(model);
}
<强> Buy.cshtml 强>
@{
Layout = "~/Views/Shared/_LayoutBlank.cshtml";
ViewBag.Title = "Validating ...";
}
<script type='text/javascript'>
$(function () {
$("form#simForm").submit();
});
</script>
@model My.Namespace.MyModel
<form id="simForm" runat="server" method='post' action='https://xxxxxx.net/url/transact.dll'>
<input type='hidden' runat="server" name='x_login' id='x_login' value="@ViewData["x_login"]" />
<input type='hidden' runat="server" name='x_fp_hash' id='x_fp_hash'value="@ViewData["x_fp_hash"]"/>
etc.
</form>
答案 2 :(得分:2)
您可以将值发布到另一个网址并在同一帖子中重定向(即将用户返回到帖子的结果页面)的唯一方法是实际让用户浏览器执行帖子。你也在用HTTPS发帖子,所以重点是要防止中间人的事情。
唯一真正的方法是将新表单返回给用户,并以编程方式告诉浏览器使用带有新值的javascript提交它。