如何发布数据到外部网站,并获得外部网站的操作结果从我的控制器'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();

如何发布数据到外部网站,并获得外部网站的操作结果从我的控制器's的动作asp.net MVC

你应该使用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>