Frage

Eigentlich habe ich eine Anwendung, die eine WebService verwendet, um einige Kunden Informationen abrufen. So war ich Validieren der Anmeldeinformationen in meiner Action wie:

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

Wo Client.Validate () ist eine Methode, die einen Booleschen Wert zurück auf der Grundlage der Informationen über den POST bereitgestellt Benutzername und Passwort

Aber ich änderte meine Meinung, und ich möchte, dass die schöne ActionFilterAttributes des Verfahrens am Anfang verwenden, so wird es nur gemacht werden, wenn die Client.validate () true zurück, genauso wie [autorisieren], aber mit meiner benutzerdefinierten webservice, so hätte ich so etwas wie:

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

und dann im Innern des ValidateAsClient hätte ich so etwas wie:

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

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

Also mein Problem ist, ich weiß nicht genau, wie es funktioniert, weil ich weiß nicht, wie die Veröffentlichung von Informationen zu übergeben [ValidateAsClient (username = postedUsername, Passwort = postedPassword)] und auch, wie kann ich die Funktion ValidateAsClient Arbeit richtig zu machen?

Ich hoffe, das ist leicht zu verstehen Vielen Dank im Voraus

War es hilfreich?

Lösung

So etwas wie dies wahrscheinlich:

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

Und es wie folgt verwendet werden:

[ValidateAsClient(HttpContext.Request.Form)]

Andere Tipps

Sie sollten die folgende Methode überschreiben.

public override void OnActionExecuting(ActionExecutingContext context)

Und aus dem Kontextobjekt, Zugriff auf Ihre Post-Daten.

Ich glaube nicht, es ist eine gute Idee, einen ActionFilterAttribute in diesem Fall zu verwenden. Und was man tun möchte, ist auf jeden Fall nicht das gleiche wie Authorize Attribut tut.

Das Authorize Attribut spritzt nur eine gemeinsame Logik in einen Controller / Aktion. Welche ist:

  

Weiterleitung melden, wenn der Benutzer nicht angemeldet ist. Else die Aktion ausgeführt werden können.

Ihre ClientLogin Aktion tut genau das, was es soll im Moment tun.
Es wäre ein schlechtes Design sein, diese Logik zu übertragen zu einem ActionFilterAttribute.

Ich würde dieses Problem mit einem benutzerdefinierten Binder in ASP.NET MVC lösen.

Angenommen, Ihre Aktion wird die folgende Signatur hat.

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

MyParam Klasse:

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

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

}

Ein dann der benutzerdefinierte Binder

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.
        }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top