【问题标题】:Changing base view type on MVC4在 MVC4 上更改基本视图类型
【发布时间】:2012-12-30 18:31:39
【问题描述】:

我从下面的链接中阅读了一篇关于在 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 关键字的情况下,有什么我想念的东西或任何方法可以使它工作吗?

已解决:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      为什么要显示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. ~/Views/web.config 中设置pageBaseType 属性(不要与~/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

      【讨论】:

      • 我刚刚尝试过。但是一样。我收到一条错误消息,指出上下文中不存在 MyProperty。并且视图类仍然从默认继承:System.Web.Mvc.WebViewPage
      • 这很奇怪。我无法重现该问题。让我通过一步一步的解释来更新我的答案。
      • 第三步正是我想念的。谢谢你的回答。
      • 那个空的Execute 很烦人。我知道它是其中一个基类中的抽象,但它的名称暗示不应该执行任何操作!
      • 为避免需要一个空的Execute 方法,只需将您的自定义WebViewPage 类声明为abstract。它不需要是具体类型 - 您继承的默认类型也是抽象的。
      猜你喜欢
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 2013-05-25
      • 2017-11-20
      • 2017-12-03
      • 2022-11-04
      相关资源
      最近更新 更多