在ClientValidationFunction之后,Asp.Net CustomValidator仍然无效

时间:2014-01-30 07:51:31

标签: c# asp.net postback client-side-validation customvalidator

我有一个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检查了响应并调试了函数),链接不会触发回发,验证器无效(即我可以看到按钮附近的红色*。)

为什么验证器仍然无效?

2 个答案:

答案 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之后您需要,