我有一个我想在View中使用的基类。我现在明白@model实际上是'WebViewPage'的实现。因此,我相信可能有更好的方法来实现我想要的,可能使用Action Filter或我的BaseController对象。
我试图做这样的事情:
public abstract class AuthenticatedViewPageBase : WebViewPage
{
private Login _user;
protected override void InitializePage()
{
_user = Session["User"] as Login;
}
public bool HasPermission(Permissions permission)
{
return HasPermission(new List<Permissions> { permission });
}
public bool HasPermission(List<Permissions> permissions)
{
if (_user == null)
_user = Session["User"] as Login;
return _user != null && permissions.Any(thisPerm => _user.Permissions.Any(p => p.PermissionId == (int)thisPerm));
}
}
并在列表视图中使用它:
@using PublicationSystem.Model.Enums
@inherits PublicationSystem.Helpers.AuthenticatedViewPageBase
@model IEnumerable<PublicationSystem.Model.Profile>
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_LayoutSmBanner.cshtml";
}
@if (HasPermission(new List<Permissions>
{
Permissions.userCreate
}))
{
<p>
@Html.ActionLink("Create New", "Create");
</p>
}
....
但当然,我不能同时使用@inherits和@model。 (Profile类是一个简单的模型。)
在MVC中获取像HasPermission这样的函数能力的好方法是什么?
答案 0 :(得分:0)
我定义了两个类似的类:
fetch
然后像这样设置\ Views \ web.config:
public abstract class AuthenticatedViewPageBase : WebViewPage
{
//....
}
public abstract class AuthenticatedViewPageBase<TModel> : WebViewPage<TModel>
{
//....
}
现在我的页面可以正常使用@model,并从我的WebViewPage抽象版本中获取自定义方法。
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="PublicationSystem.Helpers.AuthenticatedViewPageBase">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Routing" />
<add namespace="System.Web.Optimization" />
<add namespace="PublicationSystem" />
</namespaces>
</pages>
</system.web.webPages.razor>