【问题标题】:How to post data to external site and get external site's action result from my controller's action ASP .Net MVC?如何将数据发布到外部站点并从我的控制器的操作 ASP .Net MVC 中获取外部站点的操作结果?
【发布时间】:2013-03-16 02:00:16
【问题描述】:

我的视图中有一些 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 之前DoSomeDatabaseStuff();

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案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();
            }
        });
    });
    

    【讨论】:

      【解决方案2】:

      这在 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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-07
        • 2017-09-06
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多