2

過去 1.5 年間、ASP.net MVC で働いていました。サーバー側の検証にエンタープライズ アプリケーション ブロックを使用した場所。ビューモデルがビューのコントロールにバインドされ、そのように機能する検証方法が気に入りました。しかし今、私は MVC を使用しない純粋な Web フォームであるプロジェクトに取り組んでいます。

ここでは、クライアント側の検証に jQuery が使用され、サーバー側の検証はまったくありません。私はサーバー側の検証の重要性を強調しており、同じためにエンタープライズ ライブラリを使用することを計画していました。

何らかの理由で (最近 ASP.NET MVC で作業したことが原因である可能性があります)、ある時点で動けなくなりました。

私の Web フォーム アプリケーションでは、検証には必ずクライアント側とサーバー側の両方で同じロジックが含まれます。または一般的に、ASP .net Web フォームで検証をコーディングするためのベスト プラクティスは何ですか?

私は広く受け入れられている慣行に従いたかったのです。また、エンタープライズ ライブラリよりも優れた Web フォーム検証の新しい概念はありますか。サンプルは理解に役立つはずです。

4

2 に答える 2

1

CustomValidators は何にでも使用できます。私のお気に入りです!

HTML5 属性を使用するrequired="required"と、クライアント側のフィードバックが無料で得られます。

それらを利用して、次のようにサーバー側の検証を実行することもできます。

<asp:ValidationSummary runat="server" id="vSummary" />

<asp:TextBox runat="server" id="txtReq" required="required" />
<asp:DropDownList runat="server" id="ddlReq" required="required">
    <asp:ListItem text="..." value="" />
    <asp:ListItem text="Yes" value="1" />
    <asp:ListItem text="No" value="0" />
</asp:DropDownList>

<asp:Button runat="server" id="cmdSubmit" text="Submit" />

コード ビハインド関数:

private void buildRequiredWebControls(List<WebControl> lst, Control c)
{
    if (c is WebControl)
        if (String.Compare((c as WebControl).Attributes["required"] ?? String.Empty, "required", true) == 0)
            lst.Add((c as WebControl));

    foreach (Control ch in c.Controls)
        buildRequiredWebControls(lst, ch);
}

/* --------------------------------------------- */

private Boolean addAllFieldsRequired(List<WebControl> controls)
{
    foreach (WebControl w in controls)
    {
        if (w as TextBox != null)
            if (String.IsNullOrWhiteSpace((w as TextBox).Text)) return false;

        if (w as DropDownList != null)
            if (String.IsNullOrWhiteSpace((w as DropDownList).SelectedValue)) return false;
    }
    return true;
}

/* --------------------------------------------- */

private void cmdSubmit_Click(object sender, EventArgs e)
{
    vSummary.ValidationGroup = "StackOverflow";
    Page.Validate("StackOverflow");

    List<WebControl> requiredFields = new List<WebControl>();
    this.buildRequiredWebControls(requiredFields, this);

    Page.Validators.Add(new CustomValidator()
    {
        IsValid = this.addAllFieldsRequired(requiredFields),
        ErrorMessage = "Please complete all required fields.",
        ValidationGroup = "StackOverflow"
    });

    if (Page.IsValid)
    {
        //Good to Go on Required Fields
    }
}

すべてのコントロールの後に HTML に手動で挿入するという非常に単調な代替手段を打ち負かします。

<asp:ValidationSummary runat="server" id="vSummary" ValidationGroup="StackOverflow" />

<asp:TextBox runat="server" id="txtReq" required="required" />
<asp:RequiredFieldValidator runat="server" ControlToValidate="txtReq" ErrorMessage="Please Fill Out Required Field" Text="*" ValidationGroup="StackOverflow" />

<asp:DropDownList runat="server" id="ddlReq" required="required">
    <asp:ListItem text="..." value="" />
    <asp:ListItem text="Yes" value="1" />
    <asp:ListItem text="No" value="0" />
</asp:DropDownList>
<asp:RequiredFieldValidator runat="server" ControlToValidate="ddlReq" ErrorMessage="Please Fill Out Required Field" Text="*" ValidationGroup="StackOverflow" />

<asp:Button runat="server" id="cmdSubmit" text="Submit" />
于 2012-08-20T04:31:13.240 に答える
1

少ないよりも多く検証したいと思います...クライアント側のチェックに加えてサーバー側のチェックは良い考えです(特に外部に面したアプリケーションの場合)。テキストボックスには特に注意が必要です。ユーザーはスクリプトを停止できることを覚えておいてください (そして、クライアント側のスクリプトを完全に回避できます)。

ServerValidate イベントを発生させるカスタム バリデーター コントロールを使用して、サーバー側の検証を実装するのは簡単です。

私はエンタープライズ ライブラリを扱ったことがないので、それが提供する検証ルーチンについては何も答えられません。

于 2012-08-09T16:33:43.723 に答える