在MVC4上更改基本视图类型

时间:2013-01-16 12:23:41

标签: asp.net-mvc view asp.net-mvc-4 base

我已经阅读了一篇关于在下面的链接中更改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>

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文件中更改了基类型并修复了它。

2 个答案:

答案 0 :(得分: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()
    {
    }
}

然后:

<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模板
  2. 创建新的ASP.NET MVC 3应用程序
  3. 添加自定义基本视图:

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

    <div>
        @MyProperty
    </div>
    
  6. Ctrl + F5 运行应用程序,如果一切顺利,您将会看到Hello World

答案 1 :(得分:6)

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

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

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