2

編集: より明確にするために、onBegin に、Ajax 呼び出しから true または false の値を返す関数を呼び出させることを検討しています。非 ajax 関数から false 値を返したかのように、その false 値は onBegin をトリガーしてフォーム送信を中止できる必要があります。

特定の条件が存在する場合、Ajax.BeginForm の onBegin に false の値を返す必要があります。このようにして、特定のデータベース条件が存在する場合にフォームが送信されないようにすることができます。

ただし、Ajax Get の結果を使用するには、コールバックを使用する関数を作成する必要があります。つまり、onBegin で使用される関数に ajax 値を返すことはできません。では、結果を onBegin に渡すにはどうすればよいでしょうか。

基本的に私は持っています:

`Ajax.BeginForm(onBegin="checkIfMyConditionExists();"`}...

function checkIfMyConditionExists(){
   $.get(checkConditionURL, function(data){
     doSomething(data);
    });

そのデータ (true または false の値) を onBegin に取得するにはどうすればよいですか?

4

3 に答える 3

5

同期せずに達成しようとしていることは、起こりません。同期チェックを実行する必要があります。そうしないと、チェックが呼び出されますが、ajax 呼び出しが「私を待ってください」と言う前に、フォームやその他のものが送信されます。

サーバーへの ajax 呼び出しでは、呼び出しを設定する必要がありasync: falseます$.ajax。これにより、次のコードを実行する前に何らかの結果が期待される場所になります。$.getオフにするオプションがないため、実行したくないことに注意してください。

「UI をハングさせたくない」場合は.... なんらかの読み込みアイコンまたはテキストを配置します。とにかく、「ajax」の良い習慣です...

使用できるコードは次のとおりです:)

function checkIfMyConditionExists () {
    $.ajax({
        url: checkConditionURL,
        async: false,
        success: function (data) {
            if (!data.success) {
                return false;
            }

            // put your code to run something here!
        }
    });
}

それ以上複雑にする必要はありません。また、これを実装する際に留意すべき点...

jQuery.ajax のドキュメントによると:

jQuery 1.8 以降、jqXHR ($.Deferred) で async: false を使用することは推奨されなくなりました。jqXHR.done() や非推奨の jqXHR.success() などの jqXHR オブジェクトの対応するメソッドの代わりに、成功/エラー/完了のコールバック オプションを使用する必要があります。

これを達成する別の方法は、次のようにすることです。

フォームの標準ボタンを使用します。(提出ではありません)

<button id="TriggerButton">Submit</button>

そのボタンのクリックを処理します。あなたのチェックをしてください。成功したらフォームを送信してください。

$(function () {
    $("#TriggerButton").click(function (e) {
        e.preventDefault();

        $.ajax({
            url: checkConditionURL,
            success: function (data) {
                if (!data.success) {
                    // ruh roh!
                    return false;
                }

                // submit le form!
                $("#MyForm").trigger("submit");
            }
        });
    });
});

このメソッドを使用すると、onBegin を削除でき、必要なことを実行できるはずです。:)

于 2013-06-22T23:46:20.190 に答える
2

機能するソリューションでコードを変更しました:

Ajax.BeginForm(onBegin="return checkIfMyConditionExists();"}...

function checkIfMyConditionExists(){  
    $.ajax({
    url: checkConditionURL,
    data: data,
    async: false,
    success: function (data) {
        return data.condition;
    }
});

呼び出しが終了するまで待機し、その後結果を取得できる async: false オプションに注意してください。

于 2013-06-25T14:00:00.253 に答える
0

私の作業コード

JavaScript/JQuery

<script src="/Scripts/jquery-1.7.1.min.js" type="text/javascript"></script>
<script src="/Scripts/jquery.unobtrusive-ajax.min.js" type="text/javascript">
</script>

<script type="text/javascript">
    function StartValidation() {
        var result = AjaxCall();
        return result;
    }
    function AjaxCall() {
        var Istrue = false;
        $.ajax({
            url         :   "@Url.Action("Json", "FileUpload")",
            contentType :   "application/json; charset=utf-8",
            dataType    :   "json",
            type        :   "POST",
            data        :   JSON.stringify({FirstName:'test', LastName:'test1'})
        }).done(function() { 
             Istrue = true; 
             alert('ok') 
        })
        .fail(function() {
             Istrue = false; 
             alert('not ok'); 
        });
        return Istrue;
    }
</script>

HTML

@using (Ajax.BeginForm("UploadRequestFile", "FileUpload", new AjaxOptions
    {
        HttpMethod = "POST",
        OnBegin = "return StartValidation();"
    }, new { id = "frmUp" }))
{
    <input type="submit" name="Submit" value="Submit" />
}

ランタイム マークアップ

<form method="post" id="frmUp" data-ajax-method="POST" 
      data-ajax-begin="return StartValidation();" data-ajax="true" 
      action="/fileupload/UploadRequestFile?Length=10">            
      <input type="submit" value="Submit" name="Submit">
</form>

data-ajax-method、data-ajax-begin、および data-ajax 属性を確認してください。Ajax.BeginForm ヘルパーはこれらの属性を発行します。これらの属性は、ブラウザにとってまったく意味がありません。それらを理解して解釈するのは jquery.unobtrsuive-ajax.js スクリプトです。それなしで。したがって、Submit を明示的に実行する必要はありません。

アクション メソッド

[HttpPost]
public JsonResult Json(string FirstName, String LastName)
{
    //Do the Validation Part here.
    return Json(new { Success = true });
}

[HttpPost]
public ActionResult UploadRequestFile()
{
    return View();
}
于 2013-06-23T00:32:06.390 に答える