23

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

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

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

网页配置

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

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()
    {

    }
}

局部视图

@model TopMenuModel

<div class="topMenu">
@MyProperty
</div>

但是在我读过的帖子中没有关于@inherits关键字的说明。有什么我想念的东西,或者有什么方法可以@inherits在所有页面中没有关键字的情况下完成这项工作吗?

解决了:

web.config目录中的文件root不是正确的。web.config我在目录下的文件中更改了基本类型View并修复了它。

4

2 回答 2

29

你为什么展示两个版本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()
    {
    }
}

进而:

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

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

@model TopMenuModel

<div class="topMenu">
    @MyProperty
</div>

更新:

分步设置:

  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()
            {
            }
        }
    }
    
  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>
    
  4. 内部~/Views/Home/Index.cshtml使用属性:

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

于 2013-01-16T12:36:46.643 回答
6

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

 <pages pageBaseType="[MyNamespace].WebViewPageBase">

需要位于视图文件夹中的 web.config 中,而不是主项目的 web.config 中。Darin Dimitrov 的回答清楚地说明了这一点,但人们通常会忽略这个细节。我知道,因为我是他们中的一员。实际上Phil Haack的文章也是如此......

于 2013-02-27T22:02:51.430 回答