ビューでは、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"
を欠いているためです。
この装飾が含まれていることを確認するにはどうすればよいですか?
ここに寄せていただき、ありがとうございました。残念ながらあなたの推測は役に立たなかった、私はまだ余分なマークアップを得ていない。私が質問で指摘したことは、あなたの答えを述べると、CarIdがそのアノテーション、データの提案、フィルターなどと一緒にビューモデルで再び明示的に定義される場所である現在のソリューションです。残念なことにそれは私のデータモデルからモデルを見るために値を貼り付けることに疲れているので、この方法でなければならないということです。ペーストのコピーはエラーにつながります。また、手動でビューモデルのフィールドを設定する必要があります... –
...ビューの特別なモデルを使用する素晴らしい側面を鈍らせる前に、それらをエンティティに手動でマップする必要があることを意味します。 –