自定义验证器是否在FormView中工作
本文关键字:FormView 工作 是否 验证 自定义 | 更新日期: 2023-09-27 17:54:29
我通过谷歌搜索,发现很多人都在努力解决这个问题,但我仍然没有找到正确的答案。
https://i.stack.imgur.com/15jen.png我有一个表单视图,需要检查,如果语言代码是重复或不,它必须检查服务器端脚本,因为它需要通过数据库检查。
更新于2011年5月4日,19.32//我在这里添加了表单视图的属性,所以如果有什么错误,有人可以指出来。
<asp:FormView ID="fmvxLanguage" runat="server" EnableViewState="False" DefaultMode="Insert"
Visible="False" Width="95%" DataSourceID="odsLanguage" DataKeyNames="LanguageCode"
CssClass="formViewAdd">
//
<dxe:ASPxButton ID="btnAddNewLanguage" runat="server" CausesValidation="True"
Image-Url="~/images/icon/Save-icon.png" CommandName="Insert" Text="Save">
</dxe:ASPxButton>
使用插入命令作为插入按钮,Cause Validation设置为true。
<asp:CustomValidator ID="cvdLanguageCodeNameDuplicate" runat="server"
ControlToValidate="txtLanguageCode" CssClass="IconValidation"
ErrorMessage="<img src="/images/icon/validation-Icon.png"/> Language code name is duplicated."
onservervalidate="cvdLanguageCodeNameDuplicate_ServerValidate"> </asp:CustomValidator>
自定义验证器设置如上
当我单击按钮并尝试将断点放在serverValidate事件时,我甚至没有到达那里
protected void cvdLanguageCodeNameDuplicate_ServerValidate(object source, ServerValidateEventArgs args)
{
if (LanguageHelper.HaveLanguageCode(args.Value))
{
args.IsValid = false;
}
}
就目前而言,我使用标签而不是自定义验证器通过检查是否值在事件formview_iteminsert有效,如果值是无效的,我只是使用e.Cancel (FormViewInsertEventArgs),使标签可见。但是,我仍然想知道,如果自定义验证器是不工作的formview或我做错了什么。
谢谢。
下面的代码不是关于问题,但它可能是有用的,有人搜索到这个主题,可能有同样的问题。我必须重复很多次所以我为这个事件创建了可重用的类(使用label作为验证器)
public class clsFormViewDuplicationValidationSetter
{
#region Property
public FormView FormView { get; set; }
public delegate bool DelDuplicationValidationNameOnly(string pStrName);
public delegate bool DelDuplicationValidationNameAndId(string pStrName, int primaryId);
public DelDuplicationValidationNameOnly DuplicationValidationNameOnly;
public DelDuplicationValidationNameAndId DuplicationValidationDelegationNameAndId;
public TextBox TextBoxNameToCheckForDuplication { get; set; }
public Label LabelDuplicationValidationMessage { get; set; }
#endregion
#region Constructor
/// <summary>
/// Pattern For Simple Duplication ValidationName and Id
/// </summary>
/// <param name="pObjFormView">FormView</param>
/// <param name="pObjTextBoxNameToCheckForDuplication">TextBoxName</param>
/// <param name="pObjLabelDuplicationValidationMessage">Lable Showing Error Message</param>
/// <param name="pObjDuplicationValidationNameAndId">Delegation for validation function (name and id)</param>
public clsFormViewDuplicationValidationSetter(FormView pObjFormView, TextBox pObjTextBoxNameToCheckForDuplication, Label pObjLabelDuplicationValidationMessage, DelDuplicationValidationNameAndId pObjDuplicationValidationNameAndId)
{
this.FormView = pObjFormView;
this.TextBoxNameToCheckForDuplication = pObjTextBoxNameToCheckForDuplication;
this.LabelDuplicationValidationMessage = pObjLabelDuplicationValidationMessage;
this.DuplicationValidationDelegationNameAndId = pObjDuplicationValidationNameAndId;
FormView.ItemInserting += new FormViewInsertEventHandler(FormView_ItemInserting);
}
/// <summary>
/// Pattern For Simple Duplication Validation Name
/// </summary>
/// <param name="pObjFormView">FormView</param>
/// <param name="pObjTextBoxNameToCheckForDuplication">TextBoxName</param>
/// <param name="pObjLabelDuplicationValidationMessage">Lable Showing Error Message</param>
/// <param name="pObjDuplicationValidationDelegation">Delegation for validation function (name)</param>
public clsFormViewDuplicationValidationSetter(FormView pObjFormView, TextBox pObjTextBoxNameToCheckForDuplication, Label pObjLabelDuplicationValidationMessage, DelDuplicationValidationNameOnly pObjDuplicationValidationNameOnly)
{
this.FormView = pObjFormView;
this.TextBoxNameToCheckForDuplication = pObjTextBoxNameToCheckForDuplication;
this.LabelDuplicationValidationMessage = pObjLabelDuplicationValidationMessage;
this.DuplicationValidationNameOnly = pObjDuplicationValidationNameOnly;
FormView.ItemInserting += new FormViewInsertEventHandler(FormView_ItemInserting);
}
void FormView_ItemInserting(object sender, FormViewInsertEventArgs e)
{
string name = TextBoxNameToCheckForDuplication.Text;
bool IsDuplicate;
// when adding, id always 0
if (DuplicationValidationDelegationNameAndId != null)
IsDuplicate = DuplicationValidationDelegationNameAndId(name, 0);
else
IsDuplicate = DuplicationValidationNameOnly(name);
if (IsDuplicate)
{
e.Cancel = true;
FormView.Visible = true;
LabelDuplicationValidationMessage.Visible = true;
}
}
#endregion
}
在Form Load
中使用时 protected void Page_Load(object sender, EventArgs e)
{
TextBox objtxtLanguageCode= (TextBox)fmvxLanguage.FindControl("txtLanguageCode");
Label objFormViewLabelDuplicationValidationMessage = (Label)fmvxLanguage.FindControl("lblFormViewDuplicate");
clsFormViewDuplicationValidationSetter objFormViewDuplicationValidationSetter = new clsFormViewDuplicationValidationSetter(fmvxLanguage,objtxtLanguageCode,objFormViewLabelDuplicationValidationMessage,LanguageHelper.HaveLanguageCode);
}
您需要设置按钮和CustomValidator的验证组
试试这个
<dxe:ASPxButton ID="btnAddNewLanguage" runat="server" CausesValidation="True" Image-Url="~/images/icon/Save-icon.png" CommandName="Insert" Text="Save" ValidationGroup="V>
</dxe:ASPxButton>
<asp:CustomValidator ID="cvdLanguageCodeNameDuplicate" runat="server" ControlToValidate="txtLanguageCode" CssClass="IconValidation" ErrorMessage="<img src="/images/icon/validation-Icon.png"/> Language code name is duplicated." onservervalidate="cvdLanguageCodeNameDuplicate_ServerValidate" ValidationGroup="V> </asp:CustomValidator>
我们团队中的高级程序员刚刚发现,我们需要将UpdateControlPanel放在CustomValidators中,以便在服务器端验证完成且其有效状态为false时显示在EditFormView上。对于客户端验证,它总是正确工作。
我只是想找出更合适的解决办法,我们必须在继续之前调用Page.Validate()并检查是否(Page.IsValid)。如果ValidationGroup已分配,则调用Page.Validate("groupNameHere")