我研究了一些关于SO的问题,但似乎找不到答案。谁知道呢,也许我违反了惯例。在阅读了一个关于使用布局注入器属性来通过简单地指定一个属性来设置布局的优秀答案后,我想我也可以将这种类用于需要用户身份验证的属性控制器。
因此,我不必在任何地方检查身份验证,而是写了以下内容:
// class AdminAttribute
public class AdminAttribute : LayoutInjectorAttribute
{
// ctor
public AdminAttribute()
: base("_LayoutAdmin")
{
} // eo ctor
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
WebUser user = WebApplication.CurrentUser;
if (!user.IsAuthenticated)
{
filterContext.Result = new ViewResult() { ViewName = "Unauthorised" };
filterContext.Controller.ViewData.Model = new ViewModel(WebApplication.CurrentUser.Translate("msgunauthorisedtitle"));
filterContext.Result.ExecuteResult(filterContext.Controller.ControllerContext);
return;
}
base.OnActionExecuting(filterContext);
} // eo OnActionExecuting
} // eo class AdminAttribute
除了模型在处理视图时是null
之外,所有工作都有效。有人知道这是为什么吗?
查看页面(unauthorized .cshtml)
@model Py2.Web.ViewModel
<h2>@Model.Title</h2>
提前感谢!
试试:
if (!user.IsAuthenticated)
{
var result = new ViewResult { ViewName = "Unauthorised" };
var model = new ViewModel(
WebApplication.CurrentUser.Translate("msgunauthorisedtitle")
);
result.ViewData.Model = model;
filterContext.Result = result;
return;
}
注意,没有必要显式地调用ExecuteResult
,这是ASP的工作。. NET MVC框架,只需通过传递一个模型(result.ViewData.Model = model
)返回ViewResult。还要注意这个视图模型传递给视图结果的方式,而不是像您在代码中所做的那样传递给filterContext.Controller.ViewData.Model
。