MVC多个ViewModel和ModelState

问题描述 投票:3回答:1

我有两个简单的模型Model1,Model2,如下所示:

public class Model1
{
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
}
public class Model2
{
    public int Id { get; set; }
    [Required]
    public string Code { get; set; }
}

我有一个BigModel,它包含另外两个模型:

public class BigModel 
{
    public BigModel()
    {
        Model1 = new Model1 ();
        Model2 = new Model2();
    }
    public Model1 Model1 { get; set; }
    public Model2 Model2 { get; set; }
}

以及在我的控制器中:

public ActionResult Register(BigModel bigModel)
{            
    if (ModelState.IsValid)
    {
        //do somthing
        return RedirectToAction("Index");
    }            
    return View(bigModel);
}

我的问题是,为什么ModelState.IsValid始终为真?尽管设置了数据注释。以及如何一次验证两个模型?

asp.net-mvc validation model modelstate
1个回答
1
投票

请不要使用以上方法。始终尝试将ViewModel与您的视图一起使用。将所有数据注释放在该ViewModel上,并在action方法内进行检查。

请在下面以示例ViewModel为例进行详细检查。

 public class ProductViewModel
    {
        public Guid Id { get; set; }

        [Required(ErrorMessage = "required")]
        public string ProductName { get; set; }

        public int SelectedValue { get; set; }

        public virtual ProductCategory ProductCategory { get; set; }

        [DisplayName("Product Category")]
        public virtual ICollection<ProductCategory> ProductCategories { get; set; }
    }

动作方法内:

        [HttpPost]
        public ActionResult AddProduct(ProductViewModel productViewModel) //save entered data
        {
            //get product category for selected drop down list value
            var prodcutCategory = Repository.GetProductCategory(productViewModel.SelectedValue);

            //for get all product categories
       var prodcutCategories = Repository.GetAllProductCategories();

            //for fill the drop down list when validation fails 
             productViewModel.ProductCategories = prodcutCategories;

            //for initialize Product domain model
            var productObj = new Product
                                     {
                                         ProductName = productViewModel.ProductName,
                                         ProductCategory = prodcutCategory,
                                     };

            if (ModelState.IsValid) //check for any validation errors
            {
                //save recived data into database
                Repository.AddProduct(productObj);
                return RedirectToAction("AddProduct");
            }
            else
            {
                //when validation failed return viewmodel back to UI (View) 
                return View(productViewModel);
            }
        }

注意:我已写过一篇文章。请阅读以获取更多信息。

How to Use ViewModel with ASP.NET MVC ?

© www.soinside.com 2019 - 2024. All rights reserved.