2012-03-08 6 views
0

ビューでは、person(単純化のため)のオブジェクトを追加しています。しかし、(例えば)選択するすべての車のどの車のポップアップの前に表示されないドロップダウンの検証。私は詳しく説明します。mvc3 DropDownForネストされたプロパティを検証しない

私のコントローラでは、渡すViewModelをセットアップしました。移入は問題ではありません。ここにモデルの簡単なバージョンがあります。

public class PersonViewModel 
{ 
public Person Person { get; set;} 

public List<Car> Cars { get; set;} 
} 

public class Car 
{ 
[Key] 
public int CarId { get; set;} 
[Required] 
public string Name { get; set;} 
} 

public class Person 
{ 
[Key] 
public int PersonId { get; set;} 
[Required] 
public int CarId { get; set;} 
[Required] 
public string FullName { get; set;} 
} 

これまでのところ、かなり基本的です。ビューでは問題があります。ビューで

:このビューがレンダリングされると

@model PersonViewModel 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" 
type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" 
type="text/javascript"></script> 

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 
<fieldset> 
    <legend>Add Person</legend> 

    <div class="editor-label">Car</div> 
    <div class="editor-field"> 
     @Html.DropDownListFor(
      m => m.Person.CarId, 
      new SelectList(
       Model.Cars, 
       "CarId", 
       "Name", 
       0 
      ), 
      "-- Select A Car --" 
     ) 
     @Html.ValidationMessageFor(m=> m.Person.CarId) 
    </div> 
    <div class="editor-label"> 
     @Html.LabelFor(m=> m.Person.FullName) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Person.FullName) 
     @Html.ValidationMessageFor(model => model.Person.FullName) 
    </div> 

    <p> 
     <input type="submit" value="Create Person" /> 
    </p> 
</fieldset> 
} 

、人を作成するためのフォームが作成されます。このフォームでは、車名のドロップダウンリストが生成され、人の名前欄が使用可能になります。車が選択されて人の名前が入力され、作成がクリックされた場合、投稿は問題なく処理されます。

ただし、ここには矛盾があります。人の名前が記入されず、作成がクリックされた場合、入力ボックスは赤色で強調表示され、名前が必須であるというメッセージが表示されます。車が選択されていない場合は、フォームが提出されます。コントローラでは、これはif(ModelState.isValid)の下にキャッチするのは簡単ですが、私は彼らの人に車がないことをユーザーに指摘したいと思います。フィールド[Required] public int CarIdをviewmodelに追加してからバインディングを参照すると、車が選択されていない場合でもフォームが送信されなくなりますが、ハックのようです。

検証が確認されない理由は、何らかの理由で生成された<select> htmlオブジェクトが、追加されたデコレーションclass="input-validation-error" data-val-required="The field is required." data-val-number="The field must be a number." data-val="true"を欠いているためです。

この装飾が含まれていることを確認するにはどうすればよいですか?

答えて

1

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypesは何とかfalseに設定されていると思います。これは、整数などの値の型に対してRequired属性が自動的に追加されないことを意味します。これをtrueに設定すると、必要な属性がすべての値タイプのメタデータに自動的に追加され、HTML5 data-*属性が送出されます。ただし、デフォルト値はtrueです。私たちが持っていない新しい人を作成しているので、私たちはもはや、このビューモデルのためPERSONIDプロパティを必要とする

public class CreatePersonViewModel 
{ 
    public PersonViewModel Person { get; set;} 
    public List<CarViewModel> Cars { get; set;} 
} 

public class CarViewModel 
{ 
    public int CarId { get; set;} 

    public string Name { get; set;} 
} 

public class PersonViewModel 
{ 
    [Required] 
    public int? CarId { get; set;} 

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

注意:あなたが本当のビューモデルを使用することができますこの種の問題を回避するために

idはまだ割り当てられています。 CarIdは、null可能な整数として宣言され、Required属性で修飾されていることにも注意してください。ドロップダウンリストではデフォルト値(-- Select A Car --)が許可されているため、ヌル可能な型を使用してビューモデルに正しく反映させる必要があります。

+0

ここに寄せていただき、ありがとうございました。残念ながらあなたの推測は役に立たなかった、私はまだ余分なマークアップを得ていない。私が質問で指摘したことは、あなたの答えを述べると、CarIdがそのアノテーション、データの提案、フィルターなどと一緒にビューモデルで再び明示的に定義される場所である現在のソリューションです。残念なことにそれは私のデータモデルからモデルを見るために値を貼り付けることに疲れているので、この方法でなければならないということです。ペーストのコピーはエラーにつながります。また、手動でビューモデルのフィールドを設定する必要があります... –

+0

...ビューの特別なモデルを使用する素晴らしい側面を鈍らせる前に、それらをエンティティに手動でマップする必要があることを意味します。 –

関連する問題