Moo*_*ice 5 c# viewmodel asp.net-mvc-3
我研究了几个关于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
Run Code Online (Sandbox Code Playgroud)
除了null处理视图时模型的事实,所有工作都有效.有谁知道为什么会这样?
视图页面(Unauthorised.cshtml)
@model Py2.Web.ViewModel
<h2>@Model.Title</h2>
Run Code Online (Sandbox Code Playgroud)
提前致谢!
尝试这样:
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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,无需ExecuteResult显式调用,这是 ASP.NET MVC 框架的工作,只需通过传递模型 ( result.ViewData.Model = model) 来返回 ViewResult。另请注意此视图模型传递到视图结果的方式,而不是像filterContext.Controller.ViewData.Model您在代码中所做的那样。