4

1ページのチェックアウトを検証するための最良の方法を見つけようとしています。を含む :

  • 船の住所
  • 請求先住所

明らかなアドレスクラスには、、、、、、、、などが含まFirst Nameれます。Last NameStreet1Street2CityStateZipPhone

ユーザーが何かを入力する前に[OK]をクリックすると、1ダース以上の検証エラーが発生し、見苦しい赤いテキストの大きなブロックが表示されます。

アドレスを単一のエンティティとして検証し、「不完全なアドレス」などのインテリジェントなエラー、または適切な場合はより具体的なエラーを表示したいと思います。しかし、それでも問題のある個々のフィールドを強調できるようにしたいと思います。Html.ValidationSummary明らかにヘルパーがすべてのフィールドを表示するので、これを行う簡単な方法を今は見ることができません。

だから私は要約を次のように表示したいと思います:

 "Your shipping address is incomplete"

ZipとでハイライトしCityます。

完全にカスタムのValidationSummaryを実行する必要があり、完全にカスタムのデータ構造を実行する必要があると思います。

検証フレームワークを使用すると、このような要約を簡単に実行できます。要約には、個々のフィールドエラーだけでなく、インテリジェントな要約が表示されます。


編集:MVC2RCはモデルレベルのエラーをサポートするようになりました。

ValidationSummaryは、モデルレベルのエラーのみが表示されるオーバーロードをサポートするようになりました。これは、各フォームフィールドの横に検証メッセージをインラインで表示する場合に役立ちます。以前は、これらのメッセージは検証の概要に複製されていました。これらの新しい変更により、要約に全体的な検証メッセージ(「フォームの送信にエラーがありました」など)と、特定のフィールドに適用されない検証メッセージのリストを表示させることができます。

誰かがこれを行う方法の実際のサンプルを手に入れましたか?

4

5 に答える 5

3

複合Addressプロパティを使用して、アドレス全体を1つの単位として検証できます。

public class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string Zip { get; set; }
}

public class Order
{
    [Required]
    public string FirstName { get; set; }

    [Required]
    public string LastName { get; set; }

    [AddressRequired("Your shipping address is incomplete")]
    public Address ShipTo { get; set; }

    [AddressRequired("Your billing address is incomplete")]
    public Address BillTo { get; set; }

    // you could do this if you still need 1:1 mapping for model binding
    public string ShippingCity
    {
        get { return ShipTo.City; }
        set { ShipTo.City = value; }
    }
}

また、検証属性は次のようになります。

public class AddressRequiredAttribute : ValidationAttribute
{
    ...

    public override bool IsValid(object value)
    {
        var address = value as Address;

        if (address != null)
        {
            ...
        }
    }
}
于 2009-12-29T05:37:26.433 に答える
1

最近のプロジェクトで同様の問題に対処しました。カスタムの検証の概要を作成しました。コードは次のとおりです。

<%
      if (!ViewData.ModelState.IsValid)
       {
           Response.Write("<div class=\"prepend-1 span-10 last notice\">");
           Response.Write("<span>Please fix fields marked with an asteristk <span class=\"ss_sprite ss_asterisk_orange\"> </span></span>");
           Response.Write("<ul>");
           foreach (KeyValuePair<string, ModelState> keyValuePair in ViewData.ModelState)
           {
               foreach (ModelError modelError in keyValuePair.Value.Errors)
               {
                %>
                <li><%= Html.Encode(modelError.ErrorMessage)%></li>
                <%
       }
           } Response.Write("</ul>");
           Response.Write("</div>");
       }
    %> 

部分ビューで実行しましたが、元の ValidationSummary と同様に、これを HTML ヘルパー メソッドでラップした方がよいかもしれません。

内部では、特別でユニークな要件を確認できます。それが役に立てば幸い。

于 2009-11-29T15:30:04.643 に答える
1

IDataErrorInfo には次の 2 つのメンバーがあります。

  • Error - このオブジェクトの問題点を示すエラー メッセージを取得します。
  • Item - 指定された名前のプロパティのエラー メッセージを取得します。

Error メンバーを実装すると、1 つのエラー メッセージが表示されます。

于 2009-11-29T15:10:33.193 に答える
1

これが私がすることです:

最も快適な方法で検証エラーを ModelState に入れます。IDataErrorInfo を使用するか、DataAnnotations と検証ランナーを使用して、コントローラーの ModelState に直接追加できます。ModelState にエラーを入力してビューを再表示する限り、それは問題ではありません。

次に、すべての入力にも対応する Html.ValidationMessage() がフォームに関連付けられていることを確認します。

<%= Html.TextBox("city") %>
<%= Html.ValidationMessage("city", "*") %>

検証エラー クラスの CSS ルールによっては、テキスト ボックスが赤くなり、その横に赤いアスタリスクが表示され、入力を修正する必要があることがユーザーに通知されます。

最後に、完全な検証の概要を表示することに興味がないので、ModelState が有効かどうかを簡単に確認し、有効でない場合は一般的なメッセージを表示します。

<% if (!ViewData.ModelState.IsValid) { %>
    <div id="validation-message">Your Shipping Address in Incomplete</div>
<% } %>

このソリューションは、ユーザーが誤って入力した特定のフィールドを強調表示し、必要に応じてエラーの簡単な説明を表示します。

于 2009-12-25T14:08:53.987 に答える
0

Scottguは、新しい検証機能に関する素晴らしいブログ投稿をリリースしました。

モデル レベルの検証を実装する方法については詳しく説明しませんが、これを行う方法の説明として、既定の ASP.NET MVC 2 アプリケーション プロジェクト テンプレートを示しています。

オブジェクトの個々のプロパティに適用される検証属性を作成するだけでなく、クラス レベルで検証属性を適用することもできます。これにより、オブジェクト内の複数のプロパティにわたって検証ロジックを実行できます。この動作の例として、既定の ASP.NET MVC 2 アプリケーション プロジェクト テンプレート内の AccountModels.cs/vb ファイルに含まれている "PropertiesMustMatchAttribute" カスタム属性を確認できます ([ファイル] -> [新しい ASP.NET] を実行するだけです)。 VS 2010 内の MVC 2 Web プロジェクトを開き、このクラスを探します)。

于 2010-01-17T05:58:38.643 に答える