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

Kyl*_*ree 5 c# authorize-attribute asp.net-mvc-partialview asp.net-mvc-5

在我要做的核心工作中,我想要的是如果您访问www.mysite.com/admin/index,我想呈现一个局部视图,该视图显示附加了模型的“未经授权”。我真的不希望该网站显示www.mysite.com/error/unauthorized/,因为当有人真的打电话给我并告诉我在“ / error / unauthorized”页面上出现错误时,这不是很有用说“我在/ admin / index页上遇到未经授权的错误”。

我有从AuthorizeAttribute继承的CustomAuthorizeAttribute,工作正常,除了重定向之外。

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    // returns boolean if it is good or not
}
Run Code Online (Sandbox Code Playgroud)

然后,我有了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;
}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*.G. 5

由于PartialViewResult.Model是 get only 和 Returns 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;
Run Code Online (Sandbox Code Playgroud)