2009-06-01 19 views
31

Sto costruendo un ActionFilter per riutilizzare del codice per un semplice blocco di spam, in pratica quello che ho è un metodo Html Helper che esegue il rendering di una casella di testo di input e un input nascosto e, nel ActionFilter, controllo se i due valori sono lo stesso o no. In caso contrario, voglio sfruttare il resto della logica di convalida e aggiungere uno ModelStateError allo ModelState, ma come faccio? Come aggiungo uno ModelStateError da ActionFilter?Come accedere a ModelState da ActionFilter?

AGGIORNAMENTO: ecco il codice con cui sto provando. Quando prova un'azione controller che ha questo attributo, ModelState.IsValid restituisce ancora true anche se non supero qualsiasi dei valori di modulo richieste:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    var r = filterContext.HttpContext.Request; 
    if (r.Form["sixtimesnine"] != r.Form["fourtytwo"] || string.IsNullOrEmpty(r.Form["sixtimesnine"]) || string.IsNullOrEmpty(r.Form["fourtytwo"])) 
    { 
     filterContext.Controller.ViewData.ModelState.AddModelError("Spam", this.ErrorMessage); 
    } 
    base.OnActionExecuting(filterContext); 
} 

Questa è la ActionMethod:

[ValidateAntiSpam(ErrorMessage = "Spambotar får inte.")] 
public ActionResult Write(GuestbookPost postToCreate) 
{ 
    if (ModelState.IsValid) 
    { 
     _posts.Add(postToCreate); 
     return RedirectToAction("Index"); 
    } 
    return View(); 
} 

ho ho notato che se ho impostato un punto di interruzione all'interno del metodo OnActionExecuting e premuto "Test di debug", il punto di interruzione non viene mai colpito. Perché?

+0

Il fatto che il punto di interruzione non è essere punti ferita alla soluzione perché il filtro non funziona. Altri filtri di azione che hai scritto funzionano? Sei sicuro di non aver lasciato nulla? – Gidon

+0

Beh, non sono sicuro perché il codice non è in esecuzione. Ma non riesco a capire cosa avrei potuto lasciare fuori ... Mi sembra di aver fatto tutto quanto descritto qui: http://msdn.microsoft.com/en-us/library/dd410056.aspx –

risposta

73

Questo sarebbe da: filterContext.Controller.ViewData.ModelState

+1

Ho provato questo, ma non sembra funzionare. Ho aggiornato il mio post con il codice che ho attualmente. –

+1

Poiché questa è in realtà la risposta alla domanda che ho posto, ti crederò. Ho aperto una nuova domanda con il "nuovo" problema ... –

+0

http://stackoverflow.com/questions/934647/why-do-none-of-my-actionfilters-run –