为什么这个继承的视图不呈现?

时间:2009-05-28 14:32:02

标签: c# .net asp.net-mvc

我尝试了以下内容:

我有一个包含这些文件的共享库(.dll):

    • 搜索
      • PowerSearch.aspx
      • PowerSearch.aspx.cs
      • PowerSearch.aspx.designer.cs

PowerSearch.aspx文件包含我的html代码。 PowerSearch.aspx.cs文件包含:

using System.Web.Mvc;
using CommonProject.Web.Shared.Controllers;

namespace CommonProject.Web.Shared.Views.Search
{
    public partial class PowerSearch : ViewPage<SearchViewData>{}
}

而设计师我根本不关心因为它不会被使用。

没什么特别的,只是一种强烈的类型观点 我基本上从我的asp.net mvc项目中提取了一个现有的工作视图,将它放在一个单独的库中,并将命名空间改为包含“共享”一词,如“这将在几个mvc项目中共享”。

然后在我最初的asp.net mvc项目中,我创建了相同的结构,现在只有aspx页面只包含asp @Page规则。

匹配的cs文件包含:

using System.Web.Mvc;
using CommonProject.Web.Shared.Controllers;

namespace CommonProject.Web.DRE.Views.Search
{
    public partial class PowerSearch : CommonProject.Web.Shared.Views.Search.PowerSearch { }
}

没有编译错误,也没有运行时异常。只有一个巨大的空白页......

有人有个主意吗?

3 个答案:

答案 0 :(得分:0)

确保程序集(dll)位于您引用的bin文件夹中。另外,尝试将程序集命名空间添加到web.config,否则您的View将无法找到继承的页面。

<pages>
      <namespaces>
        <add namespace="CommonProject.Web.Shared"/>

答案 1 :(得分:0)

尝试将ASPX页面添加到类库有多大的困难?!当您选择“添加新项目...”时,它不在默认列表中。

我知道将控制器和模型存储在一个单独的库DLL /程序集中是可以的,但我很确定存储或共享视图并不是一件容易的事。问题是默认视图引擎正在查看磁盘上的特定文件夹中的视图(〜/ Views / Controller / ViewName.as [pc] x或〜/ Views / Shared / ViewName.as [pc] x)。使用库DLL,编译器并不知道它可以用ASPX文件做什么。它不是代码,所以除非你有一个'Build Action'设置,否则它会忽略它。有各种“内置动作”,但我认为你唯一的选择是“复制”和“嵌入资源”。复制不会复制到您需要它的文件夹(ASP.NET MVC Web项目中的Views文件夹),尽管您可以编写一个构建脚本或'Custom Tool'为您执行此操作(使用一点工作)。

Hammett(Castle Monorail)成名(现在是一名MS员工)推出了一个示例,它允许您使用自定义的VirtualPathProvider类将View存储在库程序集中,该类能够深入了解DLL并拉出View(作为资源嵌入)。示例应用程序现在只是一个概念,因此您可能遇到一些障碍,但它似乎有效,看起来像一个令人兴奋的方向。你可以在他的博客上找到它:MEF and ASP.NET MVC sample。下载代码并进行一些探索。

此博客文章ASP.NET MVC Plugins与上述文章不是同一作者,但它对该主题进行了另一次检查,并指出了另一篇关于StackOverflow的帖子,其中提出了类似的问题:Using VirtualPathProvider to load ASP.NET MVC views from DLLs

我看过Phil Haaaaaaaaaaaaaaaaaack关于在数据库中存储视图的帖子。它使用Ruby脚本而不是Web Forms,所以我不能100%确定你是否可以调整他的样本以满足你的需求。请在此处查看:Scripting ASP.NET MVC Views Stored In The Database

答案 2 :(得分:0)

.aspx文件的源代码是什么样的?确保您在页面指令中继承您的视图,如下所示:

<%@ Page Title="" Inherits="CommonProject.Web.Shared.Views.Search.PowerSearch" %&>

另外,如果您不想在page指令中指定整个命名空间,可以将其添加到&lt; namespaces /&gt; web.config中的部分:

<add namespace="CommonProject.Web.Shared.Views.Search"/>