我不知道火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
方法(在同一视图上)
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,则在客户端添加错误(如模型状态)。
这可能吗?
答案 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!");
}
}