我有一个ListView
,其模板的LinkButton
带有CustomValidator
。
<ItemTemplate>
<div>
<asp:LinkButton runat="server" ID="_linkButtonDelete"
ValidationGroup='<%# DataBinder.Eval(Container.DataItem. "Id") %>'
CausesValidation="true" />
<asp:CustomValidator runat="server" ClientValidationFunction="validateDelete"
ValidationGroup='<%# DataBinder.Eval(Container.DataItem. "Id") %>'
data-itemId='<%# DataBinder.Eval(Container.DataItem. "Id") %>'>*</asp:CustomValidator>
</div>
</ItemTemplate>
在validateDelete
函数中,我执行同步AJAX请求以确定是否可以删除特定项目。
function validateDelete(sender, args){
var itemId = sender.dataset.itemid;
$.ajax({
async:false
// other settings omitted
success: function(jsonResult){
args.IsValid = jsonResult.CanDelete;
}
});
}
但是,当我点击validateDelete
函数设置args.IsValid = true
的按钮时(我用Fiddler检查了响应并调试了函数),链接不会触发回发,验证器无效(即我可以看到按钮附近的红色*
。)
为什么验证器仍然无效?
答案 0 :(得分:2)
感谢来自 @Şhȇkhaṝ和 @ am1r_5h 的提示以及来自here的建议,即
在代码末尾设置args.IsValid
我能够通过将validateDelete
函数重构为:
function validateDelete(sender, args){
var itemId = sender.dataset.itemid;
var isValid; // <- declare outer scope variable to hold the result
$.ajax({
async:false
// other settings omitted
success: function(jsonResult){
isValid = jsonResult.CanDelete; // <- set the result of ajax call
}
// Set args.IsValid at the end of the function.
args.IsValid = isValid;
});
}
答案 1 :(得分:1)
我实现你的场景,因为我不知道你的代码背后,我把我的请求发送给ashx
处理程序:
$.ajax({
async: false,
url: "Handler1.ashx",
success: function (jsonResult) {
args.IsValid = jsonResult == "False" ? false : true;
}
});
这是handler1.ashx
实施:
public class Handler1 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.Write(true); // this return value was changing manually
// to test both true and false situations
context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
一切正常,可能问题在于您指定args.IsValid
,如果在设置jsonResult.CanDelete
之前不是boolean
,请尝试投射args.IsValid
,就像我已经使用的那样iif
,您的问题可能会得到解决......
我不知道,您在此处复制的此javascript代码是否与您网页上的原始代码不同...但在async:false
之后您需要,