在MVC4上更改基本视图类型

Hal*_*him 22 asp.net-mvc view base asp.net-mvc-4

我从以下链接中读到了一条关于在MVC上更改基本视图类型的帖子:

http://haacked.com/archive/2011/02/21/changing-base-type-of-a-razor-view.aspx

我按照说明操作,但我的页面仍然继承自System.Web.Mvc.WebViewPage.我无法访问自定义视图库中定义的任何属性,并且在运行时出现错误.当我使用@inherits关键字时,它修复了.

Web.config文件

<pages pageBaseType="[MyNamespace].WebViewPageBase">
  <namespaces>
    <add namespace="System.Web.Helpers" />
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization" />
    <add namespace="System.Web.Routing" />
    <add namespace="System.Web.WebPages" />
  </namespaces>
</pages>
Run Code Online (Sandbox Code Playgroud)

WebViewPageBase

public class WebViewPageBase : WebViewPage
{
    public SomeType MyProperty { get; set; }

    public override void InitHelpers()
    {
        base.InitHelpers();
        MyProperty = { foo };
    }

    public override void Execute()
    {

    }
}


public class WebViewPageBase<T> : WebViewPage<T>
{
    public SomeType MyProperty { get; set; }

    public override void InitHelpers()
    {
        base.InitHelpers();
        MyProperty = { foo };
    }

    public override void Execute()
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

局部视图

@model TopMenuModel

<div class="topMenu">
@MyProperty
</div>
Run Code Online (Sandbox Code Playgroud)

但在我读过的帖子中,没有关于@inherits关键字的说明.是否有任何我想念的东西或任何方式使@inherits所有页面中没有关键字的工作?

解决了:

web.configroot目录中的文件不正确.我web.configView目录下的文件中更改了基类型并修复了它.

Dar*_*rov 28

为什么你展示了两个版本WebViewPageBase:泛型和非泛型?

您只需要通用版本:

public class MyWebView<T> : WebViewPage<T>
{
    public SomeType MyProperty { get; set; }

    public override void InitHelpers()
    {
        base.InitHelpers();
        MyProperty = new SomeType();
    }

    public override void Execute()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

<pages pageBaseType="MvcApplication1.WebViews.MyWebView">
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Routing" />
  </namespaces>
</pages>
Run Code Online (Sandbox Code Playgroud)

现在在您的视图中,您将能够使用该属性:

@model TopMenuModel

<div class="topMenu">
    @MyProperty
</div>
Run Code Online (Sandbox Code Playgroud)

更新:

一步一步设置:

  1. 使用Internet模板创建新的ASP.NET MVC 3应用程序
  2. 添加自定义基本视图:

    namespace MvcApplication1
    {
        public class MyWebView<T> : WebViewPage<T>
        {
            public string MyProperty { get; set; }
    
            public override void InitHelpers()
            {
                base.InitHelpers();
                MyProperty = "Hello World";
            }
    
            public override void Execute()
            {
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 设置pageBaseType属性~/Views/web.config(不要混淆~/web.config):

    <pages pageBaseType="MvcApplication1.MyWebView">
      <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
    
    Run Code Online (Sandbox Code Playgroud)
  4. 内部~/Views/Home/Index.cshtml使用属性:

    <div>
        @MyProperty
    </div>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 点击Ctrl+F5运行该应用程序,如果一切顺利,您将收到一个Hello World.

  • 关闭和重新打开文件得到了intellisese工作. (6认同)

Mar*_*rko 6

您遇到的问题是因为您需要修改VIEWS文件夹的web.config文件.所以基本上这一行:

 <pages pageBaseType="[MyNamespace].WebViewPageBase">
Run Code Online (Sandbox Code Playgroud)

需要在您的views文件夹中的web.config中,而不是主项目的web.config.Darin Dimitrov的回答明确指出,但人们通常会忽略这一细节.我知道因为我是其中之一.实际上Phil Haack的文章也是如此......