2011-08-04 3 views
1

私は控えめなクライアントの検証を試しており、自分のシナリオでうまく動作するように苦労しています。MVC3 ViewModelsを使用したクライアントの検証

私の主な問題は、私のビューに厳密に型指定されたViewModelがあることです。このViewModelには、ドロップダウンを設定するために使用されるいくつかのコレクションが含まれており、フォームを編集したい実際のオブジェクトである追加のプロパティ(Personと呼ぶ)があります。

投稿を処理するコントローラのアクションによって、ViewModel全体がポストされていないPersonオブジェクトが取得されることが予想されます。だから私は使用することができていない:

@Html.TextBoxFor(m => m.Person.Name) 

私は名前=「名前」ではなく「Person.Name」 を持つように入力制御を必要とするので、私は

@Html.TextBox("Name", m.Person.Name) 
を使用することによって、これを修正することができます

しかし、結果の入力コントロールには、クライアントの検証に必要なdata- *属性がありません。 クライアントの検証を有効にして、ビューモデルを保持し、コントローラのアクションをすべて連携させる方法はありますか?側では

は、あなたがそれを破るように見える手で自分の <form>タグを書き出す

@using (Html.BeginForm()) 

を使用する場合にのみ追加されたフォームフィールド上のデータ - *属性のように思える注意してください。

フォームヘルパーが必要ですか?あなたが概説されたシナリオでも

+0

あなたはhtmlAttributesでTextBoxForの過負荷を使用してみましたか? @ Html.TextBoxFor(m => m.Person.Name、new {name = "Name")? –

+0

私はそれがうまくいきたいです。新しい属性を追加できますが、name属性をオーバーライドすることはできません。私はその行動が変わるべきだと思うので、あなたはそれをちょうど行うことができます。 –

答えて

1

、あなたの特性の名前は

名前と年齢がそれぞれPersonオブジェクトのプロパティです
<input type='text' name='Person.Name'..../> 
<input type='text' name='Person.Age'.../> 

のような人と一緒に付けられます。あなたはここでキャッチは、あなたのフォーム要素でプレフィックスの名前を持つオブジェクトを受信した場合、それを移入することができるようになりますmodelbinderということです

[HttpPost] 

    public ActionResult Index(Person Person) 
    { 
     //handle person here 
    } 

ようにあなたがアクションメソッドを投稿書くことができます。それが動作しない場合(それは私のために働いた)あなたはBind(Prefix="")属性を使用することができますあなたのオブジェクトをバインド後のアクションメソッドで。たとえば、バインドの使用量はあなたがViewModelには、あなたがこのような[Required]注釈で検証したいという属性を飾るために必要がありHow to use Bind Prefix?

+0

私は参照してください。はい、それは動作します、ありがとう! –

0

を見て...

using System.ComponentModel.DataAnnotations; 
..... 
public class MyViewModel 
{ 
    ..... 
    [Required] 
    public string Name { get; set; } 
    ..... 
} 
関連する問題