2010-12-05 22 views
5

Modelde ve bazı ek özelliklerde bulunan ViewModel var. Modelde ve mülkte doğrulama vardır, ancak yürütüldüğünde, yalnızca Model üzerinde doğrulama kontrol edilir, mülkte doğrulama göz ardı edilir.ASP.NET MVC Model doğrulaması ViewModel üzerinde çalışmıyor

Model:

[MetadataType(typeof(Customer_Validation))] 
public partial class Customer 
{ 
} 

public class Customer_Validation 
{ 
    [Required(ErrorMessage="Please enter your First Name")] 
    public string FirstName { get; set; } 

    [Required(ErrorMessage = "Please enter your Last name")] 
    public string LastName { get; set; } 

    [Required(ErrorMessage = "Sorry, e-mail cannot be empty")] 
    [Email(ErrorMessage="Invalid e-mail")] 
    public string Email { get; set; } 
} 

ViewModel

public class RegisterViewModel 
{ 
    public Customer NewCustomer { get; private set; } 

    [Required(ErrorMessage="Required")] 
    public string Password { get; private set; } 

    public RegisterViewModel(Customer customer, string password) 
    { 
     NewCustomer = customer; 
     Password = password; 
    } 
} 

Kontrolör

public ActionResult Create() 
{ 
    Customer customer = new Customer();  
    RegisterViewModel model = new RegisterViewModel(customer, "");  
    return View(model); 
} 

[HttpPost] 
public ActionResult Create(Customer newCustomer, string password) 
{ 
    if (ModelState.IsValid) 
    { 
     try 
     { 
      // code to save to database, redirect to other page 
     } 
     catch 
     { 
      RegisterViewModel model = new RegisterViewModel(newCustomer, password); 
      return View(model); 
     } 
    } 
    else 
    { 
     RegisterViewModel model = new RegisterViewModel(newCustomer, password); 
     return View(model); 
    } 
} 

Görünüm

@using (Html.BeginForm()) 
{ 
    <table> 
    <tr> 
    <td>First Name:</td> 
    <td>@Html.TextBoxFor(m => m.NewCustomer.FirstName)</td> 
    <td>@Html.ValidationMessageFor(m => m.NewCustomer.FirstName)</td> 
    </tr> 
    <tr> 
    <td>Last Name:</td> 
    <td>@Html.TextBoxFor(m => m.NewCustomer.LastName)</td> 
    <td>@Html.ValidationMessageFor(m => m.NewCustomer.LastName)</td> 
    </tr> 
    <tr> 
    <td>E-mail:</td> 
    <td>@Html.TextBoxFor(m => m.NewCustomer.Email)</td> 
    <td>@Html.ValidationMessageFor(m => m.NewCustomer.Email)</td> 
    </tr> 
    <tr> 
    <td>Password:</td> 
    <td>@Html.TextBoxFor(m => m.Password)</td> 
    <td>@Html.ValidationMessageFor(m => m.Password)</td> 
    </tr> 
    </table> 

    <input type="submit" value="Register" /> 
} 

Parola boş bırakılan formu gönderirseniz boş bırakın. Müşteri alanlarını boş bırakırsam (parola alanı hariç) hataları gösteriyorsa (

cevap

9

Bu normaldir. POST denetleyici eyleminiz, görünüm modeli değil, parametre olarak Customer alır. Doğrulama, model bağlayıcı tarafından gerçekleştirilir, bu nedenle model bağlayıcı, Müşteri nesnesini istek parametrelerine bağlamaya çalıştığında, doğrulamayı çağırır. Doğrulama işleminin bu görünüm modelinde gerçekleştirilmesini istiyorsanız, POST eyleminizin görünüm modelini parametre olarak alması gerekir. Şu anda tüm bu eylem modeli ile yaptığınız post eylemi yapıcıyı çağırmak ve yapıcıyı çağırmak herhangi bir doğrulama işlemini tetiklemiyor.

Yani POST eylem haline gelmelidir: Eğer zaten görünümü modelinin bir parçası olarak ikinci eylem değişken olarak parolayı geçmesi gerekmez nasıl

[HttpPost] 
public ActionResult Create(RegisterViewModel newCustomer) 
{ 
    if (ModelState.IsValid) 
    { 
     // code to save to database, redirect to other page 
    } 
    else 
    { 
     return View(newCustomer); 
    } 
} 

dikkat edin.

+0

Bu mantık geliyor ve düzeltmeme yardımcı olabilir. Bu durumda, model validasyonunu kullanmak için en iyi çözümü buluncaya kadar kontrolördeki diğer özelliklerin validasyonunu ayrı yapacağım. Çok teşekkürler. – Nestor

+0

View'in ViewModel'i post kontrol ünitesine geçirmesini nasıl sağlıyorsunuz? Daha önce denedim ve formun ViewModel'i almasından bu yana "nullable parametresi" hatası gösteriliyor, ancak PostModel içindeki her modele geri gönderirken post denetleyicisindeki imzayı eşleştiremediğinden, denetleyici null değerini ViewModel parametresi, her bir modeli ViewModel için tek bir parametre yerine ayrı bir parametre olarak almak için post denetleyicide zorlar. – Nestor

+0

@Nestor, görünümü bir ViewModel'i bir denetleyiciye iletmek için bu görünümde ve ViewModel'inizin özelliklerine karşılık gelen metin alanları içinde bir "

" içerebilir. Sadece istekte gönderilenlerin ViewModel'e bağlı olacağını unutmayın. –

0

Parola özelliğinizdeki ayarlayıcının private set olarak ayarlandığından eminim. Müşteri alanlarınızın geri kalanındaki tüm setçiler kamu kurucularıdır. Bir mülkün geçerli bir değer için düzenleyici denetimi yoksa gerekli değildir.

+0

Model bağlandığında, kurucu çağrılır, kurucu bu özel özellikleri ayarlama sorumlusudur, bu özelliklerin sınıf dışından erişmesine gerek yoktur. Nedeni Darin, sadece Modelin çağrıldığını söylüyor, ViewModel değil, bu yüzden ViewModel için bir bağlanma yok, bu yüzden doğrulama tetikleniyor. – Nestor

İlgili konular