0

select要素でクライアント側の検証を使用しようとしていますが、フォームが最初に読み込まれるときに機能しません。

これは私のモデルのプロパティです(これは実際には私のモデル内のクラス内にあります):

[Required(ErrorMessage="Please select an application type.")]
public override string Application
{
    get
    {
        return base.Application;
    }
    set
    {
        base.Application = value;
    }
}

これはビューの一部です

<div class="field_title">
    Application Type
</div>
<div class="field_validation">
    @Html.ValidationMessageFor(model => model.CreatePromocode.Application)
</div>
<div class="form_field">
    @Html.DropDownListFor(model => model.CreatePromocode.Application,
        SharedLibrary.Entities.DropDownLists.PromocodeApplicationOptions,
        "Select an application type...")
</div>

これはドロップダウンリストのアイテムコードです。このようにして、他のアプリケーションで使用して、複数の場所ではなく1つの場所で変更できるようにしています。

public class DropDownLists
{        
    public static List<SelectListItem> PromocodeApplicationOptions
    {
        get
        {
            return new List<SelectListItem>()
            {
                new SelectListItem() { 
                    Text="Earlybird Registration", Value="Earlybird"},
                new SelectListItem() { 
                    Text="Standard Registration", Value="Standard"},
                new SelectListItem() { 
                    Text="Monday Registration", Value="Monday"},
                new SelectListItem() { 
                    Text="Tuesday Registration", Value="Tuesday"},
                new SelectListItem() { 
                    Text="Wednesday Registration", Value="Wednesday"},
                new SelectListItem() { 
                    Text="Multiple Tickets", Value="TicketMany"},
                new SelectListItem() { 
                    Text="Single Ticket",Value="TicketSingle"}
            };
        }
    }
}

私が抱えている問題は、ユーザーが最初にページにアクセスしたときに、ドロップダウンリストにクライアント側の検証属性がないことです。こんな感じ

<select id="CreatePromocode_Application" name="CreatePromocode.Application">

ただし、フォームが投稿され、アプリケーションタイプが選択されていないためにModelStateが無効になると、クライアント検証がドロップダウンリストに表示され、正常に機能します。

<select data-val="true" 
    data-val-required="Please select an application type." 
    id="CreatePromocode_Application"
    name="CreatePromocode.Application" 
    class="valid">

クライアント側の検証を最初から機能させるにはどうすればよいですか?必要な属性やエラーメッセージを手動で追加する必要はありません。データアノテーションを使用する目的が損なわれるためです。

4

1 に答える 1

1

このサンプルのデフォルトコンストラクターのように、ビューモデルのCreatePromoCodeプロパティを初期化していることを確認してください。

public class YourViewModel
{
    public YourViewModel()
    {
        CreatePromoCode = new CreatePromoCode();
    }

    public BaseCreatePromoCode CreatePromoCode { get; set; }

}

public class BaseCreatePromoCode
{
    public virtual string Application { get; set; }

}

public class CreatePromoCode : BaseCreatePromoCode
{
    [Required]
    public override string Application { get; set; }
}

HtmlHelperは、ビューモデルのCreatePromoCodeプロパティのランタイムタイプを使用して、そのプロパティのメタデータを取得し、クライアント側の検証用のデータ属性を設定します。(したがって、Required属性が実際には派生クラスにのみ設定されている場合でも、検証は機能します。)

最初の投稿後にエラーが発生した場合、MVCバインダーはビューモデルとCreatePromoCodeオブジェクトのインスタンスを作成しました。エラーが表示されるようにビューを再度レンダリングすると、オブジェクトが初期化されているため、データ属性が設定され、クライアント検証が機能し始めます。

于 2012-11-20T00:13:03.560 に答える