4

Googleで検索したところ、多くの人がこの問題に苦しんでいることがわかりましたが、まだ正しい答えが見つかりません.

http://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>

挿入コマンドを [挿入] ボタンとして使用し、原因検証が true に設定されています。

<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) を使用してラベルを表示します。それでも、カスタムバリデーターがフォームビューで機能しないかどうか、または何か間違ったことをしたかどうかを知りたいです。

ありがとうございました。

次のコードは質問に関するものではありませんが、誰かがこのトピックを検索するのに役立ち、同じ問題を抱えている可能性があります。これを何度も繰り返さなければならないので、このイベント用に再利用可能なクラスを作成します (ラベルをバリデーターとして使用)

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

3 に答える 3

1

ボタンと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> 
于 2011-05-04T08:12:31.897 に答える
0

私たちのチームのシニア プログラマーは、サーバー側の検証が行われ、その有効な状態が false の場合に EditFormView に表示するために、UpdateControlPanel を CustomValidators に配置する必要があることを知りました。クライアント側の検証では、常に正しく機能します。

于 2011-05-31T12:30:20.070 に答える
0

より適切な解決策を見つけるだけです。先に進む前に、Page.Validate() を呼び出して if(Page.IsValid) を確認する必要があります。ValidationGroup が割り当てられている場合は、Page.Validate("groupNameHere") を呼び出します。

于 2011-07-21T13:25:55.157 に答える