Работает ли пользовательский валидатор в FormView?

Я провел поиск в Google и обнаружил, что многие люди борются с этой проблемой, но я все еще не нашел правильного ответа.

http://i.stack.imgur.com/15jen.png

У меня есть представление формы, и мне нужно проверить, дублируется ли языковой код или нет, его нужно проверить на серверном скрипте, поскольку его нужно было проверить через базу данных.

обновлено 4 мая 2011 г., 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>

Я использую команду вставки как кнопку «Вставить в», для параметра «Проверка причины» установлено значение «истина».

<asp:CustomValidator ID="cvdLanguageCodeNameDuplicate" runat="server" 
                        ControlToValidate="txtLanguageCode" CssClass="IconValidation" 
                        ErrorMessage="&lt;img src=&quot;/images/icon/validation-Icon.png&quot;/&gt;     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_ItemInserting, если значение недействительно, я просто использую e.Cancel (FormViewInsertEventArgs) и делаю метку видимой. но все же я хочу знать, не работает ли пользовательский валидатор на formview или я сделал что-то не так.

Спасибо.

Следующий код не относится к вопросу, но может быть полезен для тех, кто выполняет поиск по этой теме и может столкнуться с такой же проблемой. мне приходится повторять это много раз, поэтому я делаю повторно используемый класс для этого события (используя метку в качестве валидатора)

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


}

При использовании в режиме загрузки формы

    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);
    }

person Sarawut Positwinyu    schedule 04.05.2011    source источник


Ответы (3)


Вам нужно установить группу проверки кнопки и 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="&lt;img src=&quot;/images/icon/validation-Icon.png&quot;/&gt;     Language code name is duplicated."                          onservervalidate="cvdLanguageCodeNameDuplicate_ServerValidate" ValidationGroup="V>    </asp:CustomValidator> 
person santosh singh    schedule 04.05.2011
comment
Спасибо за ответ, но он все еще не работает. На самом деле он хорошо работает в режиме EditForm DevExpress GridView без настройки какой-либо группы проверки, он просто не работает в formview. - person Sarawut Positwinyu; 04.05.2011

Старший программист в нашей команде только что узнал, что нам нужно поместить UpdateControlPanel в CustomValidators, чтобы он отображался в EditFormView, когда проверка на стороне сервера выполнена, и ее действительное состояние является ложным. Для проверки на стороне клиента она всегда работает правильно.

person Sarawut Positwinyu    schedule 31.05.2011

Я просто нашел более правильное решение, мы должны вызвать Page.Validate() и проверить, если (Page.IsValid), прежде чем продолжить. если назначена ValidationGroup, вызовите Page.Validate("groupNameHere")

person Sarawut Positwinyu    schedule 21.07.2011
comment
Похоже, что, возможно, это должно было быть редактирование + расширение вашего предыдущего ответа, а не совершенно новый ответ ... Вам следует подумать об их объединении. - person forsvarir; 21.07.2011
comment
Это работает, даже если я не использую панель обновления, поэтому я не думаю, что мне нужно ее комбинировать, вам нужно использовать панель, чтобы она работала? - person Sarawut Positwinyu; 21.07.2011