Asp.net mvc 5 尝试在同一视图中使用基本MVC/页面和模型

Asp.net mvc 5 尝试在同一视图中使用基本MVC/页面和模型,asp.net-mvc-5,Asp.net Mvc 5,我试图在视图中使用一个基类。我现在明白了@model实际上是“WebViewPage”的一个实现。因此,我相信可能有更好的方法来实现我想要的,可能是使用动作过滤器或BaseController对象 我试着这样做: public abstract class AuthenticatedViewPageBase : WebViewPage { private Login _user; protected override void InitializePage() {

我试图在视图中使用一个基类。我现在明白了@model实际上是“WebViewPage”的一个实现。因此,我相信可能有更好的方法来实现我想要的,可能是使用动作过滤器或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>
}
....
<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>
并在如下列表视图中使用它:

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>
}
....
<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>
当然,我不能同时使用@inherits和@model。Profile类是一个简单的模型


在MVC中获得HasPermission等功能的好方法是什么?

我定义了两个类似的类:

public abstract class AuthenticatedViewPageBase : WebViewPage
{
    //....
}

public abstract class AuthenticatedViewPageBase<TModel> : WebViewPage<TModel>
{
    //....
}
然后设置\Views\web.config如下:

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>
}
....
<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>
现在,我的页面可以正常使用@model,并从我的抽象版本WebViewPage获取自定义方法

@model IEnumerable<PublicationSystem.Model.Profile>