1

我的视图中有一些 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>

当我将数据发布到外部站点操作时,此操作会将我重定向到其他外部站点的页面,因此我需要用户留在那里。但在发布此表单之前,我必须在我的控制器中执行一些操作/方法,但此操作只是在数据库中进行一些更改,所以我不需要任何重定向或操作结果,否则用户必须被重定向到外部站点页面,数据发布到。如何在我的操作中执行数据库更改并以编程方式将此表单发布到外部站点并在控​​制器操作中将用户重定向到此外部站点(在同一浏览器选项卡上),如下所示:

public ActionResult ChangeDBPostAndRedirectToExternal(string parameter1, string parameter2)
{
    DoSomeDatabaseStuff();    
    PostParametersToExternalSiteAndRedirectUserToPageDataPostedTo();
}

我尝试了 Redirect() 方法,但此方法无法执行后期操作。那么如何通过控制器的操作将数据发布到外部操作,并通过已处理的发布数据获取外部操作的视图结果?还是有一些更明智的方法来实现我的需要?我必须DoSomeDatabaseStuff();在 POST 之前。

4

2 回答 2

1

您应该使用 JS/AJAX 和普通(非提交)按钮。DoSomeDatabaseStuff连接您的按钮以在您自己的服务器上发出 AJAX 调用。一旦该 ajax 调用完成,调用form.submit()Javascript(其中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();
        }
    });
});
于 2013-03-16T02:07:57.110 回答
1

这在 Single Sign-On Identity Providers 中做了很多,一个想法,涉及无 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>
于 2013-03-16T05:06:04.850 回答