ASP.NET MVC - 用于验证POST数据的ActionFilterAttribute

zan*_*ona 5 asp.net-mvc post httprequest actionfilterattribute

实际上我有一个使用WebService来检索一些客户端信息的应用程序.所以我在我的ActionResult中验证登录信息,如:

[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");
    }
}
Run Code Online (Sandbox Code Playgroud)

其中Client.Validate()是一个基于POST用户名和密码提供的信息返回布尔值的方法

但是我改变了主意,我想在方法的开头使用那个好的ActionFilterAttributes,这样只要Client.validate()返回true,就像[Authorize]一样,但是使用我的自定义webservice,它就会被渲染,所以我会有类似的东西:

[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')
}
Run Code Online (Sandbox Code Playgroud)

然后在ValidateAsClient中我会有类似的东西:

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

    public Boolean ValidateAsClient()
    {
        return Client.validate(username,password);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,我不确切知道如何使其工作,因为我不知道如何将POSTED信息传递给[ValidateAsClient(username = postingUsername,password = postingPassword)]而且,我怎么能做ValidateAsClient函数是否正常工作?

我希望这很容易理解,提前谢谢

Ego*_*hin 7

这样的事情可能是这样的:

[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
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

[ValidateAsClient(HttpContext.Request.Form)]
Run Code Online (Sandbox Code Playgroud)

  • 我认为你可以使用`filterContext.HttpContext.Request.Form`访问表单集合,而不是传递它. (10认同)

J.W*_*.W. 5

您应该覆盖以下方法.

public override void OnActionExecuting(ActionExecutingContext context)
Run Code Online (Sandbox Code Playgroud)

并从上下文对象中访问您的帖子数据.