在视图中调用控制器方法

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

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

您可以将该逻辑移动到单独的类中。 由于此代码使用的是HttpContext.Session ,因此最好为您的类创建一个接口,并使用HttpContext.Session将此类作为您的具体实现。 您可以使用dependency injection框架在控制器或视图中注入所需的实现。

 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(); 

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

 @inject IUserAccessHelper UserAccessHelper @if (UserAccessHelper.IsInRole("SomeRole")) { 

In Role

} else {

Not in Role

}

您可以通过构造函数注入在控制器中注入相同的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 } } 

由于您通过dependency injection注入了所需的实现,现在您可以对控制器方法进行unit testing。 您的控制器代码现在与HttpContext没有任何紧密耦合 。 您可以为unit testing创​​建MockUserAccessHelper (不使用HttpContext)并根据需要使用它。

由于这是一种不是特定于任何控制器的通用方法,因此将其移动到单独的类中。

然后,您可以使用@using指令在视图中引用该类的命名空间(几乎与在.cs文件中完全相同),然后调用该方法。