我在Visual Studio中有一个asp.net核心应用程序。 在自动创建的视图(Events / index.cshtml)中,我想从EventsController.cs中调用此方法
public Boolean IsInRole(string Role)
{
Boolean roleMembership = false;
if (HttpContext.Session.GetInt32("ID") != null)
{
if (HttpContext.Session.GetString("Role") == Role)
{
roleMembership = true;
}
}
return roleMembership;
}
我的想法是使用
在视图的顶部调用此方法@if(IsInRole("Admin")) {
show some content
}
我该如何完成这项任务?
答案 0 :(得分:5)
您可以将该逻辑移动到单独的类中。由于此代码使用HttpContext.Session
,因此最好为您的类创建一个接口,并使用HttpContext.Session
将此类作为您的具体实现。您可以使用依赖注入框架在控制器或视图中注入所需的实现。
public interface IUserAccessHelper
{
bool IsInRole(string role);
}
public class UserAccessHelper : IUserAccessHelper
{
private readonly IHttpContextAccessor httpContextAccessor;
public UserAccessHelper(IHttpContextAccessor httpContextAccessor)
{
this.httpContextAccessor = httpContextAccessor;
}
public Boolean IsInRole(string role)
{
Boolean roleMembership = false;
if (httpContextAccessor.HttpContext.Session.GetInt32("ID") != null)
{
if (httpContextAccessor.HttpContext.Session.GetString("Role") == role)
{
roleMembership = true;
}
}
return roleMembership;
}
}
现在请务必在ConfigureServices
Startup.cs
方法中注册
services.AddTransient<IUserAccessHelper, UserAccessHelper>();
现在在剃刀视图中,您可以注入此依赖项。是的,现在可以在视图中进行DI:)
@inject IUserAccessHelper UserAccessHelper
@if (UserAccessHelper.IsInRole("SomeRole"))
{
<h2>In Role</h2>
}
else
{
<h2>Not in Role</h2>
}
您可以通过构造函数注入在控制器中注入相同的IUserAccessHelper
。
public class HomeController : Controller
{
private readonly IUserAccessHelper userAccessHelper;
public HomeController(IUserAccessHelper userAccessHelper)
{
this.userAccessHelper = userAccessHelper;
}
public ActionResult Create()
{
// you can use this.userAccessHelper.IsInRole("abc")
// to do :return something
}
}
由于您通过依赖注入注入了所需的实现,现在您可以对控制器方法进行单元测试。 您的控制器代码与HttpContext
现在没有紧密联系。您可以为单元测试创建MockUserAccessHelper
(不使用HttpContext),并根据需要使用它。
答案 1 :(得分:1)
由于这是一种非特定于任何控制器的通用方法,因此将其移动到单独的类中。
然后,您可以使用@using
指令在视图中引用该类的命名空间(几乎与您在.cs文件中的命名空间一样),然后调用该方法。