0

我试图让我的视图组件仅在用户登录时才可访问。我正在检查用户是否未通过身份验证,然后重定向到登录页面,但以下代码给了我错误

public IViewComponentResult Invoke(int? id)
        {

            if (!User.Identity.IsAuthenticated)
            {   
                return View("~/Areas/Identity/Pages/Account/Login.cshtml");
            }
//other stuff
}

但是这段代码在登录页面上给了我错误

ArgumentNullException: Value cannot be null.
Parameter name: viewData

在检查 loginviewmodel 时,它仅重载了带有参数的构造函数

public LoginModel(SignInManager<IdentityUser> signInManager, ILogger<LoginModel> logger)

我不知道如何发送这些参数。或者有更好的方法重定向到登录页面

4

2 回答 2

1

视图组件不是授权管道的一部分。它们是视图渲染管道的一部分,到那时,拒绝访问或重定向为时已晚。如果在用户未登录的情况下视图组件不应该显示,那么只需返回一个空结果,即return Content(string.Empty);. 或者,您可以在视图中对其进行门控:

@if (User.Identity.IsAuthenticated)
{
    @await Component.InvokeAsync("MyComponent")
}

你问题的最后一部分是我认为完全误解了这里的工作方式。视图组件只是一种呈现局部的方式,同时执行局部不能或不应该直接处理的某种额外工作,例如注入依赖项、查询数据库等。在这里,您试图返回一个Razor Page,这不是局部的。Razor Pages 仅在直接路由到时才起作用。在路由之后的页面模型实例化期间,框架会满足您无法弄清楚如何满足的依赖关系。

于 2019-05-13T19:10:29.440 回答
0

你读过这个:https ://docs.microsoft.com/en-us/aspnet/core/mvc/views/overview?view=aspnetcore-2.2

当您使用return View()ASP.net 时,会在Views文件夹中查找以您的控制器命名的文件夹和以该方法命名的视图。所以当你return View()在AccountController 的Profile 方法中使用时,asp.net 在Views/Account/Profile.cshtml 中查找视图。

view 方法可选地接受一个参数。这里需要传递一个viewmodel(要在视图中显示的数据)

此外,如果您想授权访问控制器方法,您应该使用基于角色或基于声明的授权:https ://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles?view =aspnetcore-2.2

于 2019-05-13T19:17:50.813 回答