2010-03-25 5 views
3

J'ai un ViewModel pour ajouter un utilisateur avec des propriétés: Email, Mot de passe, ConfirmPassword avec l'attribut Requis sur toutes les propriétés. Lors de la modification d'un utilisateur, je souhaite que les propriétés Password et ConfirmPassword ne soient pas requises.Désactiver la validation sur certains champs

Existe-t-il un moyen de désactiver la validation pour certaines propriétés dans différentes actions du contrôleur ou est-il préférable de créer un EditViewModel distinct?

Répondre

2

J'aime le décomposer et faire un modèle de base avec toutes les données communes et inhierit pour chaque vue:

class UserBaseModel 
{ 
    int ID { get; set; } 

    [Required] 
    string Name { get; set; }  

    [Required] 
    string Email { get; set; }    
    // etc... 
} 

class UserNewModel : UserBaseModel 
{ 
    [Required] 
    string Password { get; set; } 

    [Required] 
    string ConfirmPassword { get; set; } 
} 

class UserEditModel : UserBaseModel 
{ 
    string Password { get; set; } 
    string ConfirmPassword { get; set; } 
} 

Intéressé pour savoir s'il y a une meilleure façon aussi bien que cette façon semble très propre un flexible.

0

Vous pouvez écrire un attribut personnalisé qui peut tester une condition et autoriser un champ vide ou ne pas l'autoriser.

Ci-dessous est une démo simple que je mets ensemble pour les gars ici. Vous devrez modifier pour l'adapter à vos besoins/

using System.ComponentModel.DataAnnotations; 

    namespace CustomAttributes 

    { 

    [System.AttributeUsage(System.AttributeTargets.Property)] 

    public class MinimumLength : ValidationAttribute 

    { 
     public int Length { get; set; } 
     public MinimumLength() 
     { 
     } 

     public override bool IsValid(object obj) 
     { 
      string value = (string)obj; 
      if (string.IsNullOrEmpty(value)) return false; 
      if (value.Length < this.Length) 
       return false; 
      else 
       return true; 
     } 
    } 
} 

Modèle;

using CustomAttributes; 

namespace Models 
{ 
    public class Application 
    { 
     [MinimumLength(Length=20)] 
     public string name { get; set; } 
    } 
} 

Contrôleur

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Index(Application b) 
{ 
    ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

    if (ModelState.IsValid) 
    { 
     return RedirectToAction("MyOtherAction"); 
    } 
    return View(b); 
} 

enter code here 
+0

Le problème est que je veux que le champ soit obligatoire dans une action du contrôleur, mais pas dans une autre action du contrôleur, pourrait-il y avoir un moyen pour l'attribut personnalisé de savoir quelle action il est actuellement en? – adriaanp

+0

Oui il y a et vous auriez besoin de google car je ne peux pas y penser maintenant. Cela peut vous aider. http://stackoverflow.com/questions/1212429/get-controllername-and-actionname-and-populate-the-viewdata-in-master-page – griegs

Questions connexes