现在,我正在考虑一种模式,在我的动作中将“当前用户”作为modelbinded参数。
我的动作如下所示:
public JsonResult ListStuff(User currentUser, string paramter1, int parameter2)
{
}
我有一个非常简单的ModelBinder,看起来像这样:
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if ( bindingContext.ModelName == "currentUser" )
return Globals.HttpContextItems.User;
return null;
}
我真的很喜欢该操作较少依赖于另一个Controller属性。它使函数的“输入参数”更清楚,更可重用,并且将来使其更易于测试。
我对安全性问题有些担心。我可能必须非常确保(即在DefaultModelBinder中)currentUser将永远不会被其他ModelBinder自动绑定。
如果这可能是一个很好的模式,并且如果我暂时不考虑某些东西,那么任何人都可以照亮,但是将来会带来问题。
最佳答案
如果您担心其他ModelBinder会设置该参数,为什么不创建ActionFilterAttribute以便显式地装饰您的action方法:
public class GetCurrentUserAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.ActionParameters["currentUser"] = filterContext.HttpContext.User;
}
}
然后使用它:
[GetCurrentUser]
public ActionResult Index(User currentUser)
{
}
绝对不像默认模型联编程序那么干净,但是要明确得多。