Skip to main content
 首页 » 编程设计

c#之根据 Controller 中的 bool 值使 Ajax.BeginForm 的 OnSuccess 或 OnFailure 方法在 View 中生效

2024年02月01日34shangdawei

我不知道 AjaxForm 如何知道何时触发 OnSuccess 或 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 方法(在同一个 View 上)

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

这是 Controller 方法

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

目前,当提交表单时,它会调用 Controller 的方法(将人员添加到数据库的地方),然后调用上面提到的 OnSuccess 方法。到现在没问题。

但是现在,我想在 Controller 中检查一些东西(如果 person 存在的话), 这是我现在 Controller 的方法

[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:这个view没有get方法。基于 bool 值,我希望表单触发 OnSuccess 或 OnError 方法,如果它是 OnError,则在客户端添加错误(如模型状态)。

这可能吗?

请您参考如下方法:

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 返回错误消息。查看编辑后的代码。