Question

En fait, j’ai une application qui utilise un WebService pour récupérer des informations sur les clients. Donc, je validais les informations de connexion à l'intérieur de mon ActionResult comme:

[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");
    }
}

Où Client.Validate () est une méthode qui renvoie un booléen en fonction des informations fournies sur le nom d'utilisateur et le mot de passe du POST

Mais j’ai changé d’avis et j’aimerais utiliser cette belle ActionFilterAttributes au début de la méthode pour qu’elle soit simplement restituée si Client.validate () renvoie true, exactement comme [Authorize] mais avec ma commande personnalisée. service Web, donc j'aurais quelque chose comme:

[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')
}

puis à l'intérieur du ValidateAsClient, j'aurais quelque chose comme:

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

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

Mon problème est donc, je ne sais pas exactement comment le faire fonctionner, car je ne sais pas comment transmettre les informations POSTED au [ValidateAsClient (username = postedUsername, password = postedPassword)] et comment puis-je faire en sorte que la fonction ValidateAsClient fonctionne correctement?

J'espère que c'est facile à comprendre Merci d'avance

Était-ce utile?

La solution

Quelque chose comme ça probablement:

[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
    }
}

Et utilisez-le comme ceci:

[ValidateAsClient(HttpContext.Request.Form)]

Autres conseils

Vous devez remplacer la méthode suivante.

public override void OnActionExecuting(ActionExecutingContext context)

Et à partir de l'objet context, accédez à vos données de publication.

Je ne pense pas que ce soit une bonne idée d'utiliser un ActionFilterAttribute dans ce cas. Et ce que vous voulez faire n’est certainement pas la même chose que l’attribut Authorize .

L'attribut Authorize injecte simplement une logique commune dans un contrôleur / une action. Qui est:

  

Redirection vers la page de connexion, si l'utilisateur n'est pas connecté. Sinon, laissez l'action être exécutée.

Votre action ClientLogin fait exactement ce qu'elle est censée faire pour le moment.
Transférer cette logique dans un ActionFilterAttribute serait une mauvaise conception.

Je voudrais résoudre ce problème avec un classeur personnalisé dans ASP.NET MVC.

Supposons que votre action porte la signature suivante.

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.
      }

}

Un puis le classeur personnalisé

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.
        }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top