ASP.NET ControllerBase扩展方法不适用于Razor View

时间:2015-11-04 10:57:10

标签: c# asp.net-mvc razor asp.net-mvc-5

我已经创建了如下所示的扩展方法

Graph::Node::Edge

它在控制器内工作正常

public static class RBACExtension
{
    public static bool HasPermission(this ControllerBase controller, string permission)
    {
       // some implementation 
    }
}

但它在Razor内部无效。当我想使用该方法时,它不会显示在自动完成上。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        this.HasPermission("somePermission");
        return View();
    }
}

如何在Razor视图中使用它?

2 个答案:

答案 0 :(得分:2)

将扩展方法放在像

这样的命名空间中
namespace mynamespace.extensions{
public static class RBACExtension
{
    public static bool HasPermission(this ControllerBase controller, string permission)
    {
       // some implementation 
    }
 }
}

并在您的视图顶部放置一个using语句,如

@using mynamespace.extensions

然后,您的视图中将提供此方法

答案 1 :(得分:2)

ViewContext.ControllerController类,而不是您的基本控制器类。这是一个尴尬的方式,虽然它将您的控制器耦合到您的视图。相反,制作一个扩展方法(作为一种自定义的HtmlHelper是一种很好的方式),例如:

public static class MyExtensions
{
    public static bool HasPermission(this HtmlHelper helper, string permission)
    {
        // blah
    }
}

并在Razor中使用:

@Html.HasPermission("admin")

或者将该方法放在继承自WebViewPage的类中,以便在Razor视图中使用。例如:

public abstract class MyBaseViewPage : WebViewPage
{
    public bool HasPermission(string permission)
    {
        // blah
    }
}

然后通过编辑Views/web.config

让您的Razor页面使用它
<pages pageBaseType="YourProject.MyBaseViewPage">

现在在Razor你可以这样做:

@HasPermission("admin")