如何从自定义AuthorizeAttribute返回带有模型的PartialView

时间:2015-10-27 19:48:11

标签: c# asp.net-mvc-5 asp.net-mvc-partialview authorize-attribute

在我正在做的事情的核心,我想要的是如果你去www.mysite.com/admin/index我想呈现一个部分视图,显示“未授权”,其中附有一个模型。我真的不想让网站显示www.mysite.com/error/unauthorized/,因为当有人打电话告诉我“/ error / unauthorized”页面出错时我不是很有用,当我真的想要它们时说“我在/ admin / index页面上有未经授权的错误”。

我的CustomAuthorizeAttribute继承自AuthorizeAttribute正常工作,而不是重定向。

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    // returns boolean if it is good or not
}

然后我有我的HandleUnauthorizedRequest,这是我需要通过模型传递部分的地方:

if (context.RequestContext.HttpContext.User.Identity.IsAuthenticated)
{
    base.HandleUnauthorizedRequest(context);

}
else
{
    var viewResult = new PartialViewResult();
    viewResult.ViewName = "~/Views/Shared/Unauthorized.cshtml";
    viewResult.Model = new ViewModels.Unauthorized() { MyData = "My Data" }; // obviously can't do this as it is read-only

    context.Result = viewResult;
}

我知道我可以删除viewResult.Model并只使用ViewBag,但我真的希望有一些方法可以将模型传递给Partial

1 个答案:

答案 0 :(得分:4)

由于PartialViewResult.Model仅获取并返回ViewData.Model,您所要做的就是创建并设置ViewData属性:

var model = new ViewModels.Unauthorized() { MyData = "My Data" };
var viewResult = new PartialViewResult
{
    ViewName = "~/Views/Shared/Unauthorized.cshtml",
    ViewData = new ViewDataDictionary(model)
};
context.Result = viewResult;