0

ビュー内には、次のものがあります。

@using (Html.BeginForm())
{    
    <input type="submit" id="savebtn" value="Save" onclick="saveLayout()"/>
}

<script type="text/javascript">
    function saveLayout() {
        $.ajax({
            url: '/Page/SaveFaces/',
            data: {
               /* layout data of the page, irrelevant */
            },
            type: 'post',
            success: function () {                
            }
        });
        return false;
    }
</script>

上記は次のアクションにヒットし、ユーザーを元の URL にリダイレクトするだけです (データを保存することも想定されていますが、問題に影響しないため、簡単にするためにその部分を削除しました)。

[HttpPost]
public ActionResult SaveFaces(string items)
{
    return Redirect(Request.UrlReferrer.AbsoluteUri);
}

次に、リダイレクトにより、この非常に標準的なモデル取得アクションに戻ります。

public ActionResult Index(int id = 0)
{
    var page = db.Pages.Find(id);
    if (page == null) return HttpNotFound();
    return View(page);
}

問題は、この最後のアクションが 2 回呼び出されることです。

AJAX 呼び出しを削除して、通常の POST 操作を実行してみましたが、問題は解決しました。ただし、送信しようとしているデータは jQuery スクリプトを介してのみ取得でき、フォームに入れることはできません。私は AJAX メソッドを使用するように制約されています。

アクションが2回ヒットしないようにするためにできることはありますか?

4

2 に答える 2

1

を使用しているようjQueryです。代わりにこれを試してもらえますか? form(入力ボタンではなく送信イベント、またはその両方をバインドする必要がある場合があることに注意してください)

@using (Html.BeginForm())
{    
    <input type="submit" id="savebtn" value="Save" >
}

<script type="text/javascript">
    $("#savebtn").submit(function saveLayout(event) {
        // The magic that prevents post.
        event.preventDefault();

        $.ajax({
            url: '/Page/SaveFaces/',
            data: {
               /* layout data of the page, irrelevant */
            },
            type: 'post',
            success: function () {                
            }
        });

        return false;
    }
</script>

また、フォーム要素にアクセスできる場合は、別の方法:

<form onsubmit="javascript: return false;">
于 2013-05-28T14:41:14.920 に答える
0

私のシナリオに少し特有のものかもしれませんが、許容できる解決策を見つけました。すべてのデータは jQuery を介して提供されるため、フォームを完全に削除し、送信ボタンを単純なリンクに置き換えました。

したがって、これはなくなります:

@using (Html.BeginForm())
{    
    <input type="submit" id="savebtn" value="Save" />
}

そして、これは代わりに配置されます:

<a onclick="saveLayout()" id="saveLink">Click to save.</a>

これで、[HttpPost]アクションがヒットし、データが保存され、リダイレクト先のアクションも 1 回ヒットされます。

于 2013-05-28T15:02:31.913 に答える