【发布时间】:2014-02-15 03:49:32
【问题描述】:
在继续插入所述公司之前,我需要使用“远程”方法检查公司名称的可用性
我目前正在使用jQuery UI对话框来输入公司数据,因为我需要在同一页面上进行此操作,然后我列出所有公司
目前我或多或少地工作但没有按预期工作,因为远程方法只在第一次工作,下次我尝试打开对话框并尝试输入一个已经存在的名称时,“远程”方法只是不工作了,我不知道这是什么原因造成的。
编辑:我会试试看能不能解释一下
假设我有 2 家注册公司:company1 和 company2
- 第一次加载页面时,我打开对话框,试图重新输入:'company2','远程'方法正常工作( 仅当'txtName'失去焦点并从那里开始,每次更改内容时)才会调用WebMethod) 正常行为,不是吗?
- 如果我更改文本,假设我输入 'company20',则 注册公司中不存在,这次是公司 正确注册。
- 当尝试再次重新输入上一个值时,出现问题的问题( company20 ),在这种情况下,网络method不再是 调用,允许您再次注册 'company20',就像 不存在,这是不正确的。就好像 'company20' 被保留了 作为一个有效值,从第一次打开对话框开始, 但如果我输入另一个值,则确实存在,例如 company1 或 company2,“远程”方法再次正常工作。
我不知道我是否很好地解释了它,因为这很困惑,即使对我来说也很困惑,但我希望您了解我,并且可以帮助我。
这是我使用的所有 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