我在 Visual Studio 中有一个 asp.net 核心应用程序。 在自动创建的 View (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;
}
我的想法是在 View 的顶部调用这个方法
@if(IsInRole("Admin")) {
show some content
}
我怎样才能完成这个任务?
最佳答案
您可以将该逻辑移至单独的类。由于此代码使用 HttpContext.Session
,因此最好为您的类创建一个接口(interface),并使用 HttpContext.Session
让此类成为您的具体实现。您可以使用依赖注入(inject)框架在 Controller 或 View 中注入(inject)所需的实现。
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;
}
}
现在确保在 Startup.cs
ConfigureServices
方法中注册它
services.AddTransient<IUserAccessHelper, UserAccessHelper>();
现在在 razor View 中,您可以注入(inject)此依赖项。是的,现在可以在 View 中使用 DI :)
@inject IUserAccessHelper UserAccessHelper
@if (UserAccessHelper.IsInRole("SomeRole"))
{
<h2>In Role</h2>
}
else
{
<h2>Not in Role</h2>
}
您可以通过构造函数注入(inject)在您的 Controller 中注入(inject)相同的 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
}
}
由于您是通过依赖注入(inject)注入(inject)所需的实现,现在您可以对 Controller 方法进行单元测试。 您的 Controller 代码现在与 HttpContext
没有任何紧密耦合。您可以为单元测试创建一个 MockUserAccessHelper
(不使用 HttpContext)并根据需要使用它。
关于c# - 在 View 中调用 Controller 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47635284/