0

'Model'オブジェクト(LinqToSQLによって生成されたもの)をコントローラーに投稿すると、'ModelState.IsValid'をクエリできます。いずれかのプロパティに検証属性があり、値が検証されない場合は、設定されます。 'false'に。

ただし、自分のクラスのカスタムオブジェクトを投稿する場合、そのクラスのプロパティに検証属性があり、誤った値が指定されている場合でも、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; }

}
4

2 に答える 2

1

このようなファイルの場合DataAnnotationsModelBinder、デフォルトのモデルバインダーとして設定しましたか?Application_StartGlobal.asax

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

私の知る限り、System.ComponentModel.DataAnnotationsnamescapeの下の属性は、そのモデルバインダーでのみ機能します。

そのアクションに対してのみモデルバインダーを設定することもできます:

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

このブログ投稿とこの質問を参照してください。

于 2009-07-25T14:05:04.767 に答える
0

if(model.IsValid())??

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

于 2009-07-25T13:46:27.927 に答える