尝试在同一视图中使用Base MVC / Page和Model

时间:2015-09-01 19:32:19

标签: asp.net-mvc-5

我有一个我想在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这样的函数能力的好方法是什么?

1 个答案:

答案 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>