5

实际上,我有一个应用程序正在使用 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");
    }
}

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

但是我改变了主意,我想在方法的开头使用那个不错的 ActionFilterAttributes ,这样它就会在 Client.validate() 返回 true 时呈现,就像 [Authorize] 一样,但使用我的自定义 web 服务,所以我会有类似的东西:

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

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

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

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

所以我的问题是,我不知道如何使它工作,因为我不知道如何将 POSTED 信息传递给[ValidateAsClient(username=postedUsername,password=postedPassword)]以及,我怎么能ValidateAsClient 功能是否正常工作?

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

4

4 回答 4

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

并像这样使用它:

[ValidateAsClient(HttpContext.Request.Form)]
于 2009-10-21T15:20:27.833 回答
6

您应该覆盖以下方法。

public override void OnActionExecuting(ActionExecutingContext context)

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

于 2009-10-21T15:01:01.970 回答
3

我认为ActionFilterAttribute在这种情况下使用 an 不是一个好主意。而且你想做的绝对和Authorize属性不一样。

Authorize属性只是将一个通用逻辑注入到控制器/动作中。这是:

如果用户未登录,则重定向到登录页面。否则让操作执行。

你的ClientLogin行为正是它目前应该做的事情。
将这种逻辑转移到ActionFilterAttribute.

于 2009-10-21T15:21:39.560 回答
2

我将使用 ASP.NET MVC 中的自定义活页夹来解决这个问题。

假设您的操作将具有以下签名。

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

MyParam 类:

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

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

}

然后是自定义活页夹

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.
        }
}
于 2009-10-21T15:10:15.717 回答