2014-02-14 57 views
3

我有兩個簡單的模型,模型1,模型2如下:MVC多視圖模型和ModelState中

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始終爲真?雖然數據註釋已設置。以及如何在一個操作中驗證兩個模型?

+0

您是否確定視圖確實發送的不是文本而是一些文本?你也可以嘗試設置一個長度,例如'[StringLength(50),Required]' –

+0

是的,當表單被加載時,我沒有填寫必填字段並點擊提交按鈕,並且在Controller中,** bigModel **即使所需的值爲空,但ModelState仍然有效。事實上,我認爲我的BigModel沒有看到內部模型的數據註解! – Azarsa

回答

1

請不要使用上面的方法。總是嘗試使用ViewModel與您的views.Put所有您的數據註釋在該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); 
      } 
     } 

注:我已經寫this.Please的文章讀了更多的信息。

How to Use ViewModel with ASP.NET MVC ?

+0

作爲我在網站的第一個答案,你讓我感到驚訝,謝謝。我正在按照你所說的去做,而你的意思是我不使用DataAnnottions與我的實體,並總是將這些與ViewModel一起使用,你會嗎? – Azarsa

+1

@Azarsa很高興聽到它有所幫助!.Yep。這是您使用MVC時必須維護的最佳實踐。此外,您還可以使用MapInfo框架,如ValueInjecter,當您需要將域模型映射到ViewModel以及反之亦然。我也寫過關於這個。它在這裏:http://sampathloku.blogspot.com/2012/11/how-to-use-valueinjecter-with-aspnet.html – Sampath