2

В основе того, что я делаю, я бы хотел, если вы перейдете на www.mysite.com/admin/index. Я хочу отобразить частичный вид, Несанкционированный ", к которому прикреплена Модель. Я действительно не хотел, чтобы сайт показывал www.mysite.com/error/unauthorized/, поскольку это не очень полезно, когда кто-то звонит и говорит мне, что я получил сообщение об ошибке на странице «/ error/unauthorized», когда я действительно хочу их сказать: «Я получил несанкционированную ошибку на странице/admin/index».Как вернуть PartialView с моделью из пользовательского AuthorizeAttribute

У меня есть свой атрибут 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, но я был действительно надеясь, что был какой-то способ, чтобы пройти в модели с частичным

ответ

3

Поскольку PartialViewResult.Model является только получить и возвращает ViewData.Model, все, что вам нужно сделать, это создать и установить ViewData property:

var model = new ViewModels.Unauthorized() { MyData = "My Data" }; 
var viewResult = new PartialViewResult 
{ 
    ViewName = "~/Views/Shared/Unauthorized.cshtml", 
    ViewData = new ViewDataDictionary(model) 
}; 
context.Result = viewResult; 
Смежные вопросы