我已经阅读了一篇关于在下面的链接中更改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
文件中更改了基类型并修复了它。
答案 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>
更新:
逐步设置:
添加自定义基本视图:
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()
{
}
}
}
在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>
在~/Views/Home/Index.cshtml
内使用属性:
<div>
@MyProperty
</div>
按 Ctrl + F5 运行应用程序,如果一切顺利,您将会看到Hello World
。
答案 1 :(得分:6)
您遇到的问题是因为您需要修改VIEWS文件夹的web.config文件。所以基本上这一行:
<pages pageBaseType="[MyNamespace].WebViewPageBase">
需要位于views文件夹中的web.config中,而不是主项目的web.config中。 Darin Dimitrov的回答明确指出,但人们通常会忽略这一细节。我知道因为我是其中之一。实际上Phil Haack的文章也是如此......