重複を防ぐために挿入するときにgridview列を検証したいと思います。グリッドにはページングがあるので、このフィールドのすべての値をチェックするためにデータベースに移動しなければなりません。復帰時に、値が存在する場合、エラーメッセージを 'UserID exists'に設定したいと思います。Gridviewカスタムバリデーターは、ajax呼び出しから返された後にinnerHTMLを設定できません。
私の問題は、WebMethod
が結果を返し、パラメータにアクセスできない場合です。sender
またはargs
です。 success
関数でアラートを設定すると、値はnullになります。
これは、データベースに戻ったときに重複を検証する最も良い方法ですか?その場合は、sender
とargs
のパラメータを保存してカスタム検証がトリガーされるようにするにはどうすればよいですか。
これは私のマークアップです:
function ValidateUserID(sender, args) {
var EnteredUserID = args.Value;
//Call to database to check if UserID exists
$.ajax({
type: "POST",
url: "EditUsers.aspx/DoesUserIDExist",
data: JSON.stringify({ strUserID: EnteredUserID }),
contentType: "application/json; charset=utf-8",
datatype: "json",
success: function (data, sender, args) {
if (data.d == true) {
args.IsValid = false;
sender.innerHTML = "UserID exists.";
}
else {
args.IsValid = true;
sender.innerHTML = "";
}
return;
},
error: function (exception, sender, args) {
args.IsValid = false;
sender.innerHTML = "";
$("#senigvTxtBxInsertUserID").val("");
alert('An error occurred while calculating the message length: ' + exception.toString());
}
});
};
ユーザーIDの存在を検証するためにjqueryの関数から呼び出されたC#の方法:
<div id="UsersGridWrapper" runat="server">
<asp:UpdatePanel ID="UpdatePanelUserData" runat="server">
<ContentTemplate>
<asp:GridView ID="UserInfoGridView" runat="server" AllowPaging="True" PageSize="15">
<Columns>
<asp:TemplateField HeaderText="UserID">
<HeaderTemplate> UserID
<asp:ImageButton ID="senigvUserIDFilter" runat="server" ImageUrl="Images/filter.png" OnClientClick="return ShowHideFilterTxtBox('senigvTxtUserIDFilter')" />
<asp:TextBox ID="senigvTxtUserIDFilter" runat="server" AutoPostBack="true" style="display:none;" ClientIDMode="Static" OnTextChanged="senigvGridFilter_TextChanged">
</asp:TextBox>
</HeaderTemplate>
<ItemTemplate>
<asp:Label ID="senigvLblUserID" runat="server" Text='<%# Bind("UserID") %>' ></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:Label ID="senigvLblEditUserID" runat="server" Text='<%# Bind("UserID") %>' ></asp:Label>
</EditItemTemplate>
<FooterTemplate>
<asp:TextBox ID="senigvTxtBxInsertUserID" runat="server" Text='<%# Bind("UserID") %>' ClientIDMode="Static"></asp:TextBox>
<asp:RequiredFieldValidator ID="senigvRequiredFieldInsertUserID" ControlToValidate="senigvTxtBxInsertUserID" runat="server"
ErrorMessage="Required field." ValidationGroup="InsertSenderValidation" Display="Dynamic" CssClass="message-error">
</asp:RequiredFieldValidator>
<asp:RegularExpressionValidator ID="senigvMaxValInsertUserID" ControlToValidate="senigvTxtBxInsertUserID" runat="server"
ErrorMessage="Maximumn length is 40." ValidationGroup="InsertSenderValidation" Display="Dynamic" CssClass="message-error"
ValidationExpression="^.{1,40}$" >
</asp:RegularExpressionValidator>
<asp:CustomValidator ID="senigvCustomInsertUserID" ControlToValidate="senigvTxtBxInsertUserID" runat="server"
ValidationGroup="InsertSenderValidation" Display="Dynamic" CssClass="message-error"
ErrorMessage="*" ClientValidationFunction="ValidateUserID" EnableClientScript="true">
</asp:CustomValidator>
</FooterTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</div>
これは、カスタム検証中に呼び出されjqueryの関数です。
[System.Web.Services.WebMethod]
public static bool DoesUserIDExist(string strUserID)
{
bool tbUserIDExist = false;
PagingService.PagingClient tpagingClient = new PagingService.PagingClient();
string tstrXmlTableData = tpagingClient.CheckUserID(strUserID);
DataTable tdtUserID = CommonMethods.ParseXML(tstrXmlTableData);
if ((tdtUserID != null) && (tdtUserID.Rows.Count > 0))
{
string tstrUserID = tdtUserID.Rows[0]["UserID"].ToString();
if (!string.IsNullOrEmpty(tstrUserID))
{
tbUserIDExist = true;
}
}
return tbUserIDExist;
}
jquery関数が呼び出され、Us erIDがデータベース内に存在するかどうか。
私の問題は、success
関数では、sender
オブジェクトがnullであることです。データベースに行く前にこれを保存するにはどうしたらいいですか? 存在を確認するためのより良いアプローチがありますか?
これを見てください:http://stackoverflow.com/questions/3636228/asp-net-custom-validator-how-to-get-the-controltovalidate-property-on-clientv – Zaki
私の問題ではありません。私は.ajax呼び出しを行う前に送信者を特定できます。サーバから戻ってくると、 'sender'と' args'はnullです。私はajax呼び出しの前に 'senderと' args'オブジェクトを変数に保存しようとしました。そうすれば成功関数で 'IsValid'と' innerHTML'属性を設定できますが、どちらも動作しません。 –