【问题标题】:How to return PartialView with model from custom AuthorizeAttribute如何从自定义 AuthorizeAttribute 返回带有模型的 PartialView
【发布时间】:2016-01-27 09:46:35
【问题描述】:

在我所做的核心工作中,我想要的是,如果您访问 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
}

然后我有我的 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

【问题讨论】:

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


    【解决方案1】:

    由于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;
    

    【讨论】:

      猜你喜欢
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      相关资源
      最近更新 更多