2012-02-09 13 views
1

[必須]属性を設定したプロパティセットを持つUserModelを含むUserFormModelがあります。私が読んだことは、デフォルトでMVC 3がモデル内のモデルを検証することです。しかし、空のUserModelを含むUserFormModelを返すビューの空のフォームを送信すると、ModelState.IsValidは常にtrueになります。複雑なモデルでMVC 3の検証が機能しない

私はUserModelをコントローラに送り返してみましたが、それはokを検証します。私が複雑なモデルを使って作業していて、検証していないように見えます。

私はUserFormModel内のUserプロパティの[必須]属性(デフォルトの動作には必要ないと思われますが)も検証しました。

これについてのアイデアは非常に高く評価されます。

public class UserFormModel 
{ 
    public UserModel User; 

    public IEnumerable<SelectListItem> Roles { get; set; } 
} 

public class UserModel : ModelBase 
{  
    [Required] 
    public string UserName { get; set; } 

    public string Title { get; set; } 

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

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

[HttpPost] 
public ActionResult Create(UserFormModel userFormModel) 
{ 
    if (ModelState.IsValid) 
    { 
     // Do Something 
    } 
} 
+0

ビューはどのように表示されますか? – nemesv

答えて

3

フィールドではなくプロパティを使用する必要があります。だから、代わりに:

public UserModel User; 

あなたが持っている必要があります。

public UserModel User { get; set; } 

この理由は、デフォルトのモデルバインダーは、プロパティでのみ動作していることです。

+0

問題を整理していただきありがとうございます。スクールボーイのエラー! – Cragly

0

私は、検証はモデルの1つのモデルプロパティの深さに過ぎないと考えています。あなたは次のモデル

public class Product 
{ 
    public int ProductId { get; set; } 
    [Required] 
    public int ProductName { get; set; } 
    [Required] 
    public decimal Price { get; set; } 
} 

public class ProductViewModel 
{ 
    [Required] 
    public Product Product { get; set; } 
} 

を持っている場合たとえば、ビューモデルにおける製品オブジェクトに対する検証は、なりません1つの警告と製品クラスに対する検証が動作します。 Productクラスがエンティティフレームワークコードの最初のメソッドで使用されるPOCOクラスである場合、検証はデータベースに対して機能します。ビューモデルに対する検証は、私の経験で深いところでしか機能しません。

+0

この声明をバックアップする証拠はありますか? –

+0

この投稿は私の経験に基づいています。なぜ私は埋め込みオブジェクトに検証を追加できないのかわかりませんが、そのオブジェクトのプロパティに直接アクセスする必要があると思います。私は、埋め込みオブジェクトの検証アノテーションが自動的に検出され、ビューに適用されるとは思わない。 –

関連する問題