Domanda

In realtà ho un'applicazione che utilizza un servizio Web per recuperare alcune informazioni sui clienti. Quindi stavo convalidando le informazioni di accesso all'interno del mio ActionResult come:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult ClientLogin(FormCollection collection)
{
    if(Client.validate(collection["username"], collection["password"]))
    {
        Session["username"] = collection["username"];
        Session["password"] = collection["password"];
        return View("valid");
    }
    else
    {
       Session["username"] = "";
       Session["password"] = "";
       return View("invalid");
    }
}

Dove Client.Validate () è un metodo che restituisce un valore booleano in base alle informazioni fornite sul nome utente e sulla password POST

Ma ho cambiato idea e vorrei usare quel simpatico ActionFilterAttributes all'inizio del metodo in modo che venga visualizzato solo se Client.validate () restituisce true, esattamente come [Autorizza] ma con la mia abitudine webservice, quindi avrei qualcosa del tipo:

[AcceptVerbs(HttpVerbs.Post)]
[ValidateAsClient(username=postedUsername,password=postedPassword)]
//Pass Posted username and password to ValidateAsClient Class
//If returns true render the view
public ActionResult ClientLogin()
{
    return View('valid')
}

e poi all'interno di ValidateAsClient avrei qualcosa del tipo:

public class ValidateAsClient : ActionFilterAttribute
{
    public string username { get; set; }
    public string password { get; set; }

    public Boolean ValidateAsClient()
    {
        return Client.validate(username,password);
    }
}

Quindi il mio problema è che non so esattamente come farlo funzionare, perché non so come passare le informazioni POSTATE al [ValidateAsClient (nomeutente = nome utente registrato, password = nome password inserito)] e inoltre, come potrei far funzionare correttamente la funzione ValidateAsClient?

Spero sia facile da capire Grazie in anticipo

È stato utile?

Soluzione

Qualcosa del genere probabilmente:

[AttributeUsage(AttributeTargets.All)]
public sealed class ValidateAsClientAttribute : ActionFilterAttribute
{
    private readonly NameValueCollection formData;
    public NameValueCollection FormData{ get { return formData; } }

    public ValidateAsClientAttribute (NameValueCollection formData)
    {
        this.formData = formData;
    }

    public override void OnActionExecuting
               (ActionExecutingContext filterContext)
    {
        string username = formData["username"];
        if (string.IsNullOrEmpty(username))
        {
             filterContext.Controller.ViewData.ModelState.AddModelError("username");
        }
        // you get the idea
    }
}

E usalo in questo modo:

[ValidateAsClient(HttpContext.Request.Form)]

Altri suggerimenti

Dovresti sovrascrivere il seguente metodo.

public override void OnActionExecuting(ActionExecutingContext context)

E dall'oggetto contesto, accedi ai tuoi dati di post.

Non credo sia una buona idea usare un ActionFilterAttribute in questo caso. E quello che vuoi fare non è sicuramente lo stesso dell'attributo Autorizza .

L'attributo Autorizza inietta semplicemente una logica comune in un controller / azione. Che è:

  

Reindirizza alla pagina di accesso, se l'utente non ha effettuato l'accesso. Altrimenti, lascia eseguire l'azione.

La tua azione ClientLogin fa esattamente quello che dovrebbe fare al momento.
Sarebbe una cattiva progettazione portare quella logica su un ActionFilterAttribute .

Vorrei risolvere questo problema con un raccoglitore personalizzato in ASP.NET MVC.

Supponi che la tua azione abbia la seguente firma.

public ActionResult MyAction(MyParameter param)
{
  if(param.isValid)
    return View("valid");
  else
    return View("invalid");
}

Classe MyParam:

    public class MyParameter
    {
      public string UserName{get;set;}
      public string Password {get;set;}

      public bool isValid
      {
        //check if password and username is valid.
      }

}

Quindi il raccoglitore personalizzato

public class CustomBinder:IModelBinder
{
 public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
           var p = new MyParam();
           // extract necessary data from the bindingcontext like
           p.UserName = bindingContext.ValueProvider["username"] != null
                        ? bindingContext.ValueProvider["username"].AttemptedValue
                        : "";
          //initialize other attributes.
        }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top