2014-02-14 1 views
3

У меня есть две простые модели Model1, model2 как показано ниже:MVC множественным ViewModel и 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

Вы убедитесь, что View не действительно посылает ничего, а не какой-нибудь текст? Вы также можете попробовать установить длину, такую ​​как '[StringLength (50), Required]' –

+0

Да, когда форма загружена, я не заполняю необходимые поля и не нажимаю кнопку отправки, а в контроллере ** bigModel ** значения имеют нулевое значение, но ModelState остается в силе. Действительно, я думал, что мой BigModel не видел аннотации данных внутренних моделей! – Azarsa

ответ

1

Пожалуйста, не используйте вышеуказанный способ. Всегда пытайтесь использовать ViewModel с вашими представлениями. Поместите все аннотации данных на эту ViewModel и проверьте, что внутри метода действия.

Проверка Plese ниже указанного образца 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 с моими сущностями и всегда использую их с ViewModels, не так ли? – Azarsa

+1

@ Azarsa Рад слышать, что это помогло !.Yep.Это самая лучшая практика, которую вы должны поддерживать, когда работаете с MVC. И далее вы можете использовать инфраструктуру Mapper, такую ​​как ValueInjecter, когда вам нужно Map Domain Model to ViewModel и Наоборот. Я тоже написал об этом. Он здесь: http: //sampathloku.blogspot.com/2012/11/how-to-use-valueinjecter-with-aspnet.html – Sampath

Смежные вопросы