2012-10-11 14 views
9

Desidero poter avviare alcune funzioni di convalida in base a quale controller viene chiamata una vista da ... Imposterò una variabile in ViewState o qualcosa del genere e ciò mi aiuterà a sapere cosa il controller da cui è stata richiamata questa vista.Convalida condizionale in asp.net MVC4

In altre parole, voglio la convalida per essere necessario se è impostata una certa variabile ... Ecco come io uso per fare in MVC2 quando ho appena messo Jquery nel mio codice ...

HospitalFinNumber: { 
        required: function (element) { 
         debugger; 
         return '@isFlagSet' != 'True'; 
        }, 
        minlength: 6, 
        remote: function() { 
         //debugger; 
         return { 
          url: '@Url.Action("ValidateHosFin", "EditEncounter")', 
          data: { hospitalFin: $('#HospitalFinNumber').val(), encflag: '@encflag' } 
         }; 
        } 
       } 

Vedi quello che sto facendo lì. Questa convalida sarebbe necessaria solo se è impostata una certa variabile ... In questo caso, la variabile isFlagSet ... Io quindi impostare Min Length e chiamare una funzione remota per garantire che il valore sia univoco.

Non voglio farlo in tutti i casi.

Da tutto quello che ho letto finora, non c'è un modo chiaro per farlo usando un ajax non invadente? Ho sbagliato, c'è un modo per farlo? In caso contrario, come posso semplicemente inserire la vecchia convalida jquery nel mio codice?

risposta

11

ASP.NET MVC 3 utilizza validazione jQuery discreta per eseguire la convalida lato client. Così si potrebbe scrivere sia un attributo custom RequiredIf convalida o utilizzare quello fornito in Mvc Foolproof Validation e poi:

public class MyViewModel 
{ 
    [RequiredIf("IsFlagSet", true)] 
    [Remote("ValidateHosFin", "EditEncounter")] 
    [MinLength(6)] 
    public string HospitalFinNumber { get; set; } 

    public bool IsFlagSet { get; set; } 

    public string EncFlag { get; set; } 
} 

Poi tutto quello che resta è quello di includere gli script jquery.validate.js e jquery.validate.unobtrusive.js o utilizzare il relativo fascio in ASP.NET MVC 4 che li include.

+0

Hey Darin. È passato un po 'di tempo da quando ti ho sentito. Ma sembra che sia la strada da percorrere. – SoftwareSavant

+0

Devo aggiungere qui, che Foolproof non ha ancora il supporto di Entity Framework! Se ti stai chiedendo perché stai ricevendo una "eccezione non implementata" su db.SaveChanges(); potresti sentirti come me e devi capire che questo non è ancora codificato ... vedi anche: http://foolproof.codeplex.com/workitem/18457 – CodingYourLife

+1

@Darin Dimitrov Non funziona su MVC 4 bcos che non ha chiamato RequiredIfValidator – CMMaung

3

Un'altra soluzione suggerita da Andy West sul suo blog è quello di condizionale rimuovere i campi dallo Stato modello nel controller:

Quando il form viene inviato, rimuovere i campi da parte dello Stato modello in modo che non stanno convalidati :

if (Request.IsAuthenticated) 
{ 
    ModelState.Remove("CommenterName"); 
    ModelState.Remove("Email"); 
} 

Ha funzionato per me.

+1

Non male. Sono passati un paio di anni, ma lo prendo. – SoftwareSavant

+1

Va bene, ma la convalida di Javascript continua a fare in modo che il modulo non venga pubblicato e non raggiunga mai il controller. Nella mia situazione, era se il paese in un modulo di registrazione è "USA", quindi convalidare lo Zip come formato 5 o 5 + 4. Se non è USA, quindi ignorare la convalida per quel campo. Sembra che sarebbe una funzionalità comune senza una buona soluzione che possa essere trovata. oltre alla convalida del lato controller con una porzione di javascript che rimuove o aggiunge gli attributi dei dati di convalida, che è essenziale. – stephenbayer