现在,我正在考虑一种模式,在我的动作中将“当前用户”作为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)
{
}


绝对不像默认模型联编程序那么干净,但是要明确得多。

08-19 16:18