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>

データを external-site-action に投稿すると、このアクションによって他の外部サイトのページにリダイレクトされるため、ユーザーはそこにとどまる必要があります。しかし、このフォームが投稿される前に、コントローラーでいくつかのアクション/メソッドを実行する必要がありますが、このアクションはデータベースにいくつかの変更を加えているだけなので、リダイレクトやアクションの結果は必要ありません。それ以外の場合、ユーザーは外部サイトページにリダイレクトする必要があります、データが投稿されます。アクションでデータベースの変更を実行し、このフォームをプログラムで外部サイトに投稿し、コントローラー アクションでユーザーをこの外部サイト (同じブラウザー タブ) にリダイレクトするには、次のようにします。

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

Redirect() メソッドを試しましたが、このメソッドではポスト アクションを実行できません。では、コントローラーのアクションを介して外部アクションにデータを投稿し、処理された投稿データで外部アクションのビュー結果を取得するにはどうすればよいですか? または、必要なものを達成するためのより賢明なアプローチはありますか? DoSomeDatabaseStuff();POSTの前に必要です。

4

2 に答える 2

1

これは、シングル サインオン ID プロバイダーで多く行われています。Ajaxを使用しない1 つのアイデアです。アクションへの単純な投稿を作成し、すべてのビジネス ロジックを作成してから、ビューで JavaScript への呼び出しを「アクティブ化」します。外部URLへの2回目の投稿を行う関数。

例えば:

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 に答える