【问题标题】:jQuery Validate's remote method inside a jQuery UI Dialog only works oncejQuery UI 对话框中的 jQuery Validate 的远程方法只工作一次
【发布时间】:2014-02-15 03:49:32
【问题描述】:

在继续插入所述公司之前,我需要使用“远程”方法检查公司名称的可用性

我目前正在使用jQuery UI对话框来输入公司数据,因为我需要在同一页面上进行此操作,然后我列出所有公司

目前我或多或少地工作但没有按预期工作,因为远程方法只在第一次工作,下次我尝试打开对话框并尝试输入一个已经存在的名称时,“远程”方法只是不工作了,我不知道这是什么原因造成的。

编辑:我会试试看能不能解释一下

假设我有 2 家注册公司:company1company2

  1. 第一次加载页面时,我打开对话框,试图重新输入:'company2','远程'方法正常工作( 仅当'txtName'失去焦点并从那里开始,每次更改内容时)才会调用WebMethod) 正常行为,不是吗?
  2. 如果我更改文本,假设我输入 'company20',则 注册公司中不存在,这次是公司 正确注册。
  3. 当尝试再次重新输入上一个值时,出现问题的问题( company20 ),在这种情况下,网络method不再是 调用,允许您再次注册 'company20',就像 不存在,这是不正确的。就好像 'company20' 被保留了 作为一个有效值,从第一次打开对话框开始, 但如果我输入另一个值,则确实存在,例如 company1company2,“远程”方法再次正常工作。

我不知道我是否很好地解释了它,因为这很困惑,即使对我来说也很困惑,但我希望您了解我,并且可以帮助我。

这是我使用的所有 javascript

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">

    <script type="text/javascript">
     $(document).ready(function() {     

            var dialogFormValidator= $("#form2").validate({
                 rules: {
                   txtName: {
                      required: true,
                      remote: function(){
                        var result={
                            type: "POST", 
                            url: "RemoteMethod.aspx/IsUnique",
                            data: "{'name': '" + $('#txtName').val() + "'}" ,
                            contentType: "application/json; charset=utf-8",  
                            dataType: "json",                              
                            dataFilter: function(data) { 
                                  var x = (JSON.parse(data)).d;
                                  return JSON.stringify(x); 
                            }  

                        }
                        return result;
                      }
                  },
                  txtAddress: {
                      required: true
                  }
               },
               messages :{
                 txtName : {       
                    remote: " That name is already taken,please enter a different one."
                 }               

               }

            });
            $("#dialog-form").dialog({
                autoOpen: false,
                width: 350,
                height: 290,
                modal: true,
                beforeClose: function(event, ui) { 
                    $("#txtName").val("");
                    $("#txtAddress").val("");   
                    dialogFormValidator.resetForm();                    

                },
                buttons:
                {
                    "Add": function() {

                        var valid = dialogFormValidator.form(); 
                        if (valid) {
                            var name = $("#txtName").val();
                            var address = $("#txtAddress").val();


                            var params = new Object();
                            params.name = name;
                            params.address = address;
                            params = JSON.stringify(params);

                            $.ajax({
                                type: 'POST',
                                url: 'RemoteMethod.aspx/AddNewItem',
                                data: params,
                                contentType: "application/json; charset=utf-8",
                                dataType: "json",
                                success: function(msg) {
                                    if (msg.d) {

                                        <%=ClientScript.GetPostBackEventReference(UpdatePanel1,"") %>;
                                        $("#dialog-form").dialog("close");

                                    }
                                },
                                error: function(XMLHttpRequest, textStatus, errorThrown) {
                                    alert(textStatus + ": " + XMLHttpRequest.responseText);
                                }
                            });
                         } 


                        },
                        "Cancel": function() {                           
                            $(this).dialog("close");
                        }
                    }
            });

            $("#add").click(function(event) {
                event.preventDefault();
                $("#dialog-form").dialog("open");
            });
        });

    </script>    
</asp:Content>

如您所见,一旦满足所有验证,我立即通过 javascript 刷新 UpdatePanel 的内容(显示所有现有公司的网格视图)。(为了简单起见,我使用了 UpdatePanel)

这也是用于检查公司名称可用性的 WebMehod:

 <WebMethod()> _
    Public Shared Function IsUnique(ByVal name As String) As Boolean
        Dim count As Integer = 0
        Using cn As New SqlConnection(My.Settings.Conexion.ToString())
            Dim sql As String = "SELECT COUNT(*) FROM Companies WHERE Name=@Name"
            cn.Open()
            Dim cmd As New SqlCommand(sql, cn)
            cmd.Parameters.AddWithValue("@Name", name)
            count = Convert.ToInt32(cmd.ExecuteScalar())
            cn.Close()
        End Using
        If count Then
            Return False
        Else
            Return True
        End If

    End Function

编辑:ASP.net 标记:

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <div>
        <a href="#" id="add">Add New</a>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:GridView ID="gvSucursales" runat="server" AutoGenerateColumns="False" 
                    DataKeyNames="Id">                  
                    <Columns>
                        <asp:BoundField DataField="Id" HeaderText="Id">
                            <ItemStyle Width="50px" />
                        </asp:BoundField>
                        <asp:BoundField DataField="Nombre" HeaderText="Name">
                            <ItemStyle Width="200px" />
                        </asp:BoundField>
                        <asp:BoundField DataField="Direccion" HeaderText="Address">
                            <ItemStyle Width="300px" />
                        </asp:BoundField>
                    </Columns>                  
                </asp:GridView>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="ContentPlaceHolder2" runat="server">
    <div id="dialog-form" title="Add new Company">
        <p>
            All the fields are required.</p>
        <form id="form2">
        <table>
            <tr>
                <td>
                    <label for="txtName" id="lblName">
                        Name</label>
                </td>
                <td>
                    <input type="text" name="txtName" id="txtName" class="text ui-widget-content ui-corner-all" />
                </td>
            </tr>
            <tr>
                <td>
                    <label for="txtAddress" id="lblAddress">
                        Address</label>
                </td>
                <td>
                    <input type="text" name="txtAddress" id="txtAddress" class="text ui-widget-content ui-corner-all" />
                </td>
            </tr>
        </table>
        </form>
    </div>
</asp:Content>

任何关于如何解决这个问题的想法将不胜感激

【问题讨论】:

  • 您的#form2 元素是否也在更新面板中?
  • @DidierG.- 不,不是。 #form2 在 ContentPlaceHolder 中,我添加了该部分,以便您获得更好的想法
  • 我迅速检查了,但在同一实现方面没有真正的麻烦(除了检查名称的数据库调用外)。究竟什么是“不再工作”?是远程 val。不再叫了?你有错误吗?
  • @didierg。 - 我已经尝试详细描述问题,请查看原始问题

标签: jquery jquery-ui jquery-validate jquery-ui-dialog


【解决方案1】:

我怀疑该插件似乎缓存了该值并进行了一些搜索,我发现我可以使用 removeData("previousValue") 手动使缓存无效,而这正是我所做的:

$("#txtName").change(function () {
    $("#txtName").removeData("previousValue");
});

你猜怎么着...? 有效!

【讨论】:

  • @DidierG。谢谢 :D 我真的很感激你过去几天为我所做的一切
【解决方案2】:

首先我有一个问题:你的AddNewItem 页面方法被命中了吗?

我根据您的代码为自己创建了一个小项目。 对我来说,拨打IsUnique 一直没问题。 我在调用AddNewItem 页面方法时遇到了麻烦,但总是返回Internal 500 Error

params 对象传递给AddNewItem 方法的方式不正确。您的代码将生成一个像这样的 json 字符串:

var params = new Object();
params.name = name;
params.address = address;
params = JSON.stringify(params);

// params => '{"name": "xxx", "address": "ndndnd"}'

但 asp.net 期望这样:'{"params": {"name": "xxx", "address": "ndndnd"}}'(假设 AddNewItem 的参数称为“params”。

var oParams = new Object();
oParams.name = name;
oParams.address = address;

var oData = { 'params' : oParams };

$.ajax({
   ...
   data: JSON.stringify(oData),
   ...
});

更改后,我的项目按预期工作,我可以添加新项目,并且 IsUnique 会考虑添加的项目。

希望这是您问题的解决方案... 判断它是否不适合您的需求


使用远程验证规则和 .form()

您的“添加”按钮处理程序也可能存在缺陷。你正在这样做:

 var valid = dialogFormValidator.form(); 
 if (valid) {

问题是远程规则需要一些时间来执行,并且在它完全执行之前,该字段将被认为是有效的。

这意味着在远程规则执行结束之前,if (valid)true,如果它实际上使该字段无效,那就太迟了。

我找到了一篇关于这个问题的文章:https://stackoverflow.com/...jquery-validation-waiting-for-remote-check-to-complete

我对文章中提出的 while() 解决方案不太满意,但它可以给你一些想法。

【讨论】:

  • 我对@9​​87654334@ 方法没有任何问题,因为我的WebMethod 预期有两个参数:'name' 和'address',但我必须承认你的建议更实用,正是我想要传递参数的方式(再一次,谢谢)但由于我完全不知道该怎么做,我最终一个接一个地传递参数
  • 现在,关于remote 方法的问题,我尝试使用remote_complete 变量并将return result; 放入while,但问题仍然存在我也注意到问题似乎如果我刷新页面自行解决..问题是,这正是我想要避免的
猜你喜欢
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
相关资源
最近更新 更多