实际上我有一个使用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]一样,但是我的自定义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')
}
然后在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 = postingUsername,password = postingPassword)] < / b>而且,我怎样才能使ValidateAsClient函数正常工作?
我希望这很容易理解 提前致谢
答案 0 :(得分: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)]
答案 1 :(得分:5)
您应该覆盖以下方法。
public override void OnActionExecuting(ActionExecutingContext context)
从上下文对象中,访问您的帖子数据。
答案 2 :(得分:3)
在这种情况下,我不认为使用ActionFilterAttribute
是个好主意。你想做的事情肯定与Authorize
属性不一样。
Authorize
属性只是将一个公共逻辑注入控制器/动作。这是:
如果用户未登录,则重定向到登录页面。否则,请执行该操作。
您的ClientLogin
行动恰好是目前应该做的事情
将该逻辑转移到ActionFilterAttribute
。
答案 3 :(得分:1)
我会在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.
}
}