c# - 在 View 中调用 Controller 方法

标签 c# asp.net-mvc asp.net-core

我在 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/

相关文章:

javascript - 返回带有 HTML 和 JavaScript 的 PartialView

c# - visual studio 2015 更新 2 RTM 和 RC 调试上下文不可用

javascript - 在 Ajax 调用期间获取 header 值

C# double.ToString() 最大位数和尾随零

asp.net-mvc - 如何将 IStringLocalizer 注入(inject) IApplicationModelConvention?

asp.net-core - 跨多个项目共享 View 组件

c# - SignalR .NET Core camelCase JSON 契约(Contract)解析器

c# - 如何使用业务对象绑定(bind) rdlc 报告?

c# - 释放变量占用的内存

asp.net-mvc - 如何将函数序列化为 json(使用 razor @<text>)