2009-07-25 25 views
0

'Model'オブジェクト(LinqToSQLによって生成されたオブジェクト)をコントローラにポストすると、 'ModelState.IsValid'をクエリできます。プロパティと値が検証されない場合、 'false'に設定されます。ASP.NET MVCのプレーンオブジェクトで検証が機能しない

しかし、自分のクラスのカスタムオブジェクトを投稿している場合は、そのクラスのプロパティに検証属性があり、値が正しくない場合でも、ModelState.IsValidは常に 'true'を返すようです。

なぜこれはDataContextモデルオブジェクトでのみ機能しますか? ModelState.IsValidで動作させるこれらのオブジェクトについてはどうですか?通常のクラスではできません。

通常のクラスではどうすればいいですか?


コントローラーコード:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult LogIn(MyProject.Website.ViewModels.Shared.LogIn model) 
{ 
    if (ModelState.IsValid) 
     return View(model); 

    // ... code to log in the user 
} 

のViewModelコード:場合

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.ComponentModel.DataAnnotations; 
using MyProject.Website.Validators; 
using System.ComponentModel; 

public class LogIn 
{ 

    public LogInModes LogInMode { get; set; } 

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

    public string Password { get; set; } 

    public bool RememberMe { get; set; } 

    public string ReturnUrl { get; set; } 

} 
+1

私はそれがフレームワークではないと思うが、少しのコードがなくても問題の内容を知ることは難しい。 – tvanfosson

答えて

1

Application_StartイベントでDataAnnotationsModelBinderをデフォルトのモデルバインダーに設定しましたか?Global.asaxのようなファイルですか?

protected void Application_Start() { 
    ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder(); 
} 

Becasueは、私の知る限り、System.ComponentModel.DataAnnotations namescape下の属性のみがそのモデルバインダーで動作します。

あなたはまた、唯一のそのアクションのためにあなたのモデルバインダーを設定することができます。

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult LogIn([ModelBinder(typeof(DataAnnotationsModelBinder))] 
    Yieldbroker.Website.ViewModels.Shared.LogIn model) { 
    //... 
} 

this blog postと、このquestionを参照してください。

0

はあなただけしようとすべきではない(model.IsValid())?

EDIT:申し訳ありませんが、モデルのようなものから継承しているログインクラスが必要です。