根据控制器中的bool值,使Ajax.BeginForm在视图中触发OnSuccess或OnFailure方法?

时间:2014-02-20 08:34:09

标签: c# jquery ajax asp.net-mvc

我不知道火AjaxFormOnSuccess方法时OnError会如何知道。但是,是否有可能使它们基于Boolean值触发OnSuccess或OnError方法?

@using(Ajax.BeginForm("AddAttendeeManual", "Attendee", new AjaxOptions { HttpMethod = "POST", OnSuccess = "doneManualEmail" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()
    @Html.HiddenFor(m=>m.SelectedManualEmail.AppointmentId)


    <div class="form-group">
    @Html.LabelFor(m => m.SelectedManualEmail.Email, new { @class = "col-md-2 control-label" })
    <div class="col-md-8 input-group">
        @Html.TextBoxFor(m => m.SelectedManualEmail.Email, new {@class = "form-control",PlaceHolder="Email"}) 
        <input type="submit" id="btnManual"class="btn btn-default" value="Add>>" />
     </div>
     </div>
} 

这是OnSucess方法(在同一视图上)

   function doneManualEmail() {
        alert("Success");
        $(@Html.IdFor(m=>m.SelectedManualEmail.Email)).val('');
        var url = $("#invitedPeoples").data('url');
        $.get(url, function (data) {
            $('#invitedPeoples').html(data);
        });
    };   

这是控制器方法

[HttpPost]
[ValidateAntiForgeryToken]
public void AddAttendeeManual(CreateAppointmentSelectPersons manualEmail)
{      
     _attendeeRepository.AddManualAttendee(manualEmail.SelectedManualEmail.AppointmentId,
     manualEmail.SelectedManualEmail.Email);                             
}

当前提交表单时,它调用控制器的方法(其中person被添加到数据库中),并且在该调用之后调用上面提到的OnSuccess方法。直到现在都没问题。

但是现在,我想在控制器中检查某些内容(如果有人) 这是我现在的控制器方法

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddAttendeeManual(CreateAppointmentSelectPersons manualEmail)
{
   bool result =  _attendeeRepository.CheckIfAttendeeExists(manualEmail.SelectedManualEmail.AppointmentId, manualEmail.SelectedManualEmail.Email);
    if(!result)
    {
        _attendeeRepository.AddManualAttendee(manualEmail.SelectedManualEmail.AppointmentId,
        manualEmail.SelectedManualEmail.Email);
        //call OnSuccess method


    }
    else
    {               
        //add ModelStateError on client side?? or make it fire OnError method?
    }

}

PS:此视图没有get方法。根据bool值,我希望表单触发OnSuccess或OnError方法,如果是OnError,则在客户端添加错误(如模型状态)。

这可能吗?

2 个答案:

答案 0 :(得分:4)

Ajax.BeginForm OnError方法基本上是jQuery.ajax error函数,并在请求失败时被调用。因此,在您的情况下,除非您手动抛出异常,否则无法触发它。在我看来,这是一个解决方案,但不是一个好的解决方案。 CheckIfAttendeeExists是正常的商业案例,应由代码处理,而不是抛出异常。

相反,您可以返回一个JSON,指示与会者是否存在:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddAttendeeManual(CreateAppointmentSelectPersons manualEmail)
{
   bool result = _attendeeRepository.CheckIfAttendeeExists(manualEmail.SelectedManualEmail.AppointmentId, manualEmail.SelectedManualEmail.Email);
    if(!result)
    {
        _attendeeRepository.AddManualAttendee(manualEmail.SelectedManualEmail.AppointmentId,
        manualEmail.SelectedManualEmail.Email);
    }
    return Json(new { AttendeeExists = result, ErrorMessage = "Attendee already exists" });
}

在客户端检查属性:

function doneManualEmail(response) {
    if(response.AttendeeExists) {
         alert(response.ErrorMessage); // or something else
    }
    else {
        alert("Success");
        $(@Html.IdFor(m=>m.SelectedManualEmail.Email)).val('');
        var url = $("#invitedPeoples").data('url');
        $.get(url, function (data) {
            $('#invitedPeoples').html(data);
        });
    }
};

ModelState在这里不会帮到你,因为你的模型是有效的。您可以使用JSON返回错误消息。请参阅编辑过的代码。

答案 1 :(得分:1)

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddAttendeeManual(CreateAppointmentSelectPersons manualEmail)
{
    bool result = _attendeeRepository.CheckIfAttendeeExists(manualEmail.SelectedManualEmail.AppointmentId, manualEmail.SelectedManualEmail.Email);
    if(!result)
    {
        _attendeeRepository.AddManualAttendee(manualEmail.SelectedManualEmail.AppointmentId,
        manualEmail.SelectedManualEmail.Email);
        //this doesn't necessarily guarantee the onError won't get called
        //there are other reasons your ajax request could fail
    }
    else
    {               
        //throw an exception
        throw new Exception("Ajax Call Failed!");
    }

}

另见: ASP.NET MVC Intentional Ajax Failure