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é?
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
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 –