如何将数据发布到外部站点并从我的控制器操作ASP .Net MVC获取外部站点的操作结果?

时间:2013-03-16 02:00:17

标签: c# asp.net-mvc

我的视图中有一些html表单,必须发布到某个外部站点:

我视图中的Html表单

<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操作。那么如何通过我的控制器操作将数据发布到外部操作并获取外部操作的查看结果与处理的发布数据?或者是否有一些更明智的方法来实现我的需求?我必须在POST之前DoSomeDatabaseStuff();

2 个答案:

答案 0 :(得分:1)

您应该使用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();
        }
    });
});

答案 1 :(得分:1)

这在单点登录身份提供商中做了很多,一个想法,涉及无Ajax,它是为您的操作制作一个简单的帖子并制作所有业务逻辑,然后是视图“激活”对javascript函数的调用,该函数将第二个帖子发送到外部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>