我有以下ajax.actionlink负责删除答案对象: -
<td>
@Ajax.ActionLink("Delete", "Delete", "Answer",
new { id = answer.AnswersID },
new AjaxOptions
{
Confirm = "Are You sure You want to delete this Answer ?",
HttpMethod = "Post",
UpdateTargetId = @answer.AnswersID.ToString(),
OnSuccess = "deleteconfirmation",
OnFailure = "deletionerror"
})
</td>
以及以下deleteconfirmation.js: -
function deleteconfirmation() {
jAlert('The Answer was deleted succsfully', 'Deletion Confirmation');
$(this).remove();
}
是ajax.actionlink会调用folloiwng动作方法: -
[HttpPost]
public ActionResult Delete(int id)
{
var a = repository.FindAnswer(id);
repository.DeleteAnswer(a);
repository.Save();
return Content("");
assessments.");
}
但我面临以下问题: -
如果我使用firefox网络浏览器删除一个对象,那么jAlert('The Answer was deleted succsfully', 'Deletion Confirmation');
将不会显示,而它将使用IE显示,那么可能是什么原因?
我浏览到显示答案对象的目标网页,然后我从数据库中手动删除答案对象,之后我点击删除对象后面的删除ajax链接(刷新页面之前),所以我期待onfailure脚本将被执行,但它没有,而是引发了一个null异常。
有没有办法提供jquery确认框而不是Confirm = "Are You sure You want to delete this Answer ?",
BR
* 编辑: - * 非常感谢您的详细解答,但我有以下几点需要澄清: -
在删除控制器操作中,您将返回一个空内容 (返回内容(“”))但您已定义UpdateTargetId = 链接中的@ answer.AnswersID.ToString()使FireFox抛出一个 错误,因为您无法将空内容插入DOM
我从action方法返回一个空字符串,因为我不需要在删除后向用户显示任何内容,因为我使用$ (this).remove();
从DOM中删除已删除的对象所以应该是什么在这种情况下,查看_foo
是否包含?
另一方面,如果您在服务器上处理此异常并且 使用它而不让它传播并返回200 HTTP状态 代码
但在我的情况下,action方法不处理空指针异常,但另一方面,如果引发空指针异常,则不会执行Ajax.Actionlink onFailure !!。
再次感谢你的帮助..
答案 0 :(得分:1)
1)如果我使用firefox web浏览器删除一个对象,那么 jAlert('答案被删除了','删除确认'); 将不会显示,而它将使用IE显示,所以可能是什么 原因?
在您的Delete
控制器操作中,您将返回一个空内容(return Content("")
),但您在链接中定义了一个UpdateTargetId = @answer.AnswersID.ToString()
,这会导致FireFox抛出错误,因为您无法插入将内容清空到DOM中 - 它没有意义。我猜IE对这种错误更加宽容。我想在IE中,当你没有收到错误时,删除后给定的DOM元素根本不刷新。
因此,您必须返回一些实际内容,例如删除控制器操作中的部分视图:
[HttpPost]
public ActionResult Delete(int id)
{
var a = repository.FindAnswer(id);
repository.DeleteAnswer(a);
repository.Save();
return PartialView("_Foo");
}
现在,这个局部视图的内容将用于刷新给定的DOM元素。
2)然后浏览到显示答案对象的目标网页 我手动删除数据库中的答案对象,之后我 单击删除对象后面的删除ajax链接(之前 刷新页面),所以我期待onfailure脚本 将被执行,但它没有,而是引发了一个空的异常。
如果在服务器端抛出异常并返回500 HTTP状态代码,则将调用OnFailure回调。另一方面,如果您在服务器上处理此异常并使用它而不使其传播并返回200 HTTP状态代码,则即使服务器上出现错误,也将执行OnSuccess
回调。
3)有没有办法提供一个jquery确认框而不是 确认=“您确定要删除此答案吗?”
当然,只需使用OnBegin
代替Confirm
:
@Ajax.ActionLink(
"Delete",
"Delete",
"Answer",
new { id = answer.AnswersID },
new AjaxOptions
{
HttpMethod = "Post",
UpdateTargetId = answer.AnswersID.ToString(),
OnBegin = "deletebegin",
OnSuccess = "deleteconfirmation",
OnFailure = "deletionerror"
}
)
并在您的deletebegin
回调中:
function deletebegin() {
// Show whatever confirmation you want here and return true
// to proceed with the AJAX request and false to cancel it.
// As an example I am using the standard confirm js method but
// you could really use whatever you like
var shouldProceed = confirm('Are You sure You want to delete this Answer ?');
return shouldProceed;
}