1

[Required] 属性が設定された一連のプロパティを持つ UserModel を含む UserFormModel があります。MVC 3 をそのまま使用すると、デフォルトでモデル内のモデルが検証されることを読みました。ただし、空の UserModel を含む UserFormModel を返すビューで空のフォームを送信すると、ModelState.IsValid は常に true になります。

UserModel だけをコントローラーに送り返してみましたが、問題はありません。検証されていないのは、複雑なモデルを扱っているときだけのようです。

UserFormModel 内の User プロパティの [Required] 属性を使用して試してみましたが (これは、デフォルトの動作が機能するために必要ではないと思います)、それでも検証は行われません。

これに関するアイデアは大歓迎です。

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
    }
}
4

2 に答える 2

3

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

public UserModel User;

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

public UserModel User { get; set; }

これは、既定のモデル バインダーがプロパティでのみ機能するためです。

于 2012-02-10T07:00:32.617 に答える
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 クラスである場合、検証はデータベースに対して機能します。ビューモデルに対する検証は、私の経験では 1 つの深さしか機能しません。

于 2012-02-10T20:08:38.897 に答える