在视图中调用控制器方法

Thi*_*ies 3 c# asp.net-mvc asp.net-core

我在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;
}
Run Code Online (Sandbox Code Playgroud)

我的想法是在视图的顶部调用此方法

@if(IsInRole("Admin")) {
    show some content
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能完成这项任务?

Shy*_*yju 6

您可以将该逻辑移动到单独的类中.由于此代码正在使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在确保在ConfigureServices方法中注册它Startup.cs

services.AddTransient<IUserAccessHelper, UserAccessHelper>();
Run Code Online (Sandbox Code Playgroud)

现在在剃刀视图中,您可以注入此依赖项.是的,DI现在可以在视图中:)

@inject IUserAccessHelper UserAccessHelper
@if (UserAccessHelper.IsInRole("SomeRole"))
{
    <h2>In Role</h2>
}
else
{
    <h2>Not in Role</h2>
 }
Run Code Online (Sandbox Code Playgroud)

您可以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
    }
}
Run Code Online (Sandbox Code Playgroud)

由于您通过依赖注入注入了所需的实现,现在您可以对控制器方法进行单元测试.您的控制器代码与HttpContext现在没有任何紧密耦合.您可以MockUserAccessHelper为单元测试创建一个(不使用HttpContext)并根据需要使用它.