asp.net-mvc - MVC 多个 ViewModel 和 ModelState

标签 asp.net-mvc validation model modelstate

我有两个简单的模型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; }
}

在我的 Controller 中:

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

我的问题是为什么 ModelState.IsValid 总是 true?虽然设置了数据注释。以及如何在一次操作中验证两个模型?

最佳答案

请不要使用上述方式。始终尝试将 ViewModel 与您的 View 一起使用。将所有数据注释放在该 ViewModel 上,并在操作方法中检查它。

请检查下面提到的示例 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);
            }
        }

关于asp.net-mvc - MVC 多个 ViewModel 和 ModelState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21790270/

相关文章:

php - 如何测试输入字段是否包含外来字符?

Django 用户模型 Oauth

javascript - 监控 AngularJS 指令中输入元素的 $valid

python - 恢复Tensorflow模型方式差异

django - django 模型可以有嵌入类吗?

asp.net-mvc - 如何为HandleErrorInfo模型提供对象?

asp.net-mvc - 只允许从特定的电子邮件域注册

c# - ASP MVC 模型列表 <object> 在 POST 操作中返回空

c# - 捆绑链接的 JavaScript 文件

django - 自定义 Django 字段的验证