如何发布数据到外部网站,并获得外部网站的操作结果从我的控制器's的动作asp.net MVC
本文关键字:外部 网站 控制器 MVC net asp 我的 结果 数据 何发布 操作 | 更新日期: 2023-09-27 18:04:04
我有一些html表单在我的视图必须张贴到一些外部网站:
Html form on my view
<form action="http:''externalsite'external-site-action" method="POST">
<input type="text" name="parameter1" value="someValue1"/>
<input type="text" name="parameter2" value="someValue1"/>
<input type="submit" value="Submit to external site">
</form>
当我发布数据到external-site-action这个动作将我重定向到其他外部网站的页面,所以我需要用户留在那里。但是在此表单发布之前,我必须在我的控制器中执行一些操作/方法,但此操作只是在数据库中进行一些更改,所以我不需要任何重定向或操作结果,否则用户必须重定向到外部站点页面,数据被发布到。我如何在我的操作中执行数据库更改,并使此表单以编程方式发布到外部站点,并在控制器操作中将用户重定向到此外部站点(在相同的浏览器选项卡上),如下所示:
public ActionResult ChangeDBPostAndRedirectToExternal(string parameter1, string parameter2)
{
DoSomeDatabaseStuff();
PostParametersToExternalSiteAndRedirectUserToPageDataPostedTo();
}
我尝试了Redirect()方法,但是这个方法不能执行post action。那么我怎么能通过我的控制器的动作发布数据到外部动作,并获得外部动作的视图结果与处理过的数据?还是有更明智的方法来达到我的目的?我必须在POST之前添加DoSomeDatabaseStuff();
你应该使用JS/AJAX和一个普通的(非提交)按钮。将您的按钮连接起来,向您自己的服务器上的DoSomeDatabaseStuff
发出AJAX调用。ajax调用完成后,在Javascript中调用form.submit()
(其中form
是对实际表单的DOM引用)以允许正常的POST行为继续进行(用户将最终访问外部站点)。
下面是一些做作的jQuery示例代码:
$('#your-non-submit-button').click(function() {
$.ajax({
url: '@Url.Action("ChangeDBPost")',
contentType: 'application/json; charset=utf-8',
data: JSON.stringify({ 'parameter1': $('input[name="parameter1"]').val(), ... }),
success: function(result) {
$('form').submit();
}
});
});
这在单点登录身份提供程序中做了很多,一个的想法,这涉及到没有ajax,它是一个简单的post到你的动作,并使你所有的业务逻辑,然后在视图上"激活"调用一个javascript函数,使第二个post到外部url。
例如:public ActionResult ChangeDBPostAndRedirectToExternal(string parameter1, string parameter2)
{
DoSomeDatabaseStuff();
ViewBag.PostViaJs = String.Format("post_to_url('{0}','{1}', '{2}');", externalUrl, parameter1, parameter2);
}
然后在视图中打印这个调用:
<script type="text/javascript">
function post_to_url(path, parameter1, parameter2) {
var form = document.createElement("form");
form.setAttribute("method", "POST");
form.setAttribute("action", path);
form.setAttribute("target", "_blank");
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", "parameter1");
hiddenField.setAttribute("value", parameter1);
//add another hidden field for parameter2
form.appendChild(hiddenField);
document.body.appendChild(form);
form.submit();
}
@ViewBag.PostViaJs
</script>