2

编辑:为了更清楚,我希望 onBegin 调用一个从 Ajax 调用返回真或假值的函数。该错误值需要能够触发 onBegin 以中止表单提交,就像我从非 ajax 函数返回了错误值一样。

如果存在某些条件,我需要将 false 值返回给 Ajax.BeginForm 的 onBegin。这样,如果存在某些数据库条件,我可以阻止表单提交。

但是,为了使用 Ajax Get 的结果,我需要制作函数以使用回调,这意味着我不能让 onBegin 使用的函数返回 ajax 值。那么如何将结果传递给 onBegin 呢?

基本上我有:

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

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

如何将这些数据(这将是我的真值或假值)放入 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 对象的相应方法,例如 jqXHR.done() 或已弃用的 jqXHR.success()。

实现此目的的另一种方法是执行以下操作。

使用表单上的标准按钮。(不是提交)

<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 脚本。没有它。因此,无需显式执行提交。

动作方法

[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 回答