请求.html文件时调用ASP.NET MVC控制器

时间:2012-07-03 21:20:43

标签: asp.net-mvc asp.net-routing

我需要为遗留应用程序添加一些新的生命:)

我想在请求“静态”HTML页面时调用MVC控制器,以便在将页面返回给客户端之前向页面添加一些标记。

我尝试按照此主题中的方法进行操作:How to read web.config settings in .html page?

...但即使我定义了这条路线:

routes.MapRoute(
    name: "Topic", 
    url: "html/{fileName}.html", 
    defaults: new { controller = "Topic", action = "Index" });

未调用控制器。我的web.config定义为:

<remove name="WebServiceHandlerFactory-Integrated" />
<add name="HTML" path="*.html" verb="*" 
    type="System.Web.UI.PageHandlerFactory" 
    resourceType="File" preCondition="integratedMode" />

我怀疑除了PageHandlerFactory之外我还需要调用其他东西,或者问题可能完全不同。

更新:我的开发环境正在使用集成管道模式,但我需要检查我的生产环境是否支持它。

2 个答案:

答案 0 :(得分:6)

如果你这样做:

routes.RouteExistingFiles = true;

即使没有添加处理程序,您应该会发现它有效。在控制器中,您可以使用HostingEnvironment.VirtualPathProvider的{​​{1}}方法直接加载HTML并对其执行某些操作 - 或者更好的方法是使用与静态文件呈现相同内容的普通MVC视图,添加你的内容。

虽然请注意,这意味着任何可能被任何路由捕获的文件都将被推送到MVC管道中。但是,如果使用路线和物理路径的适当分离,这通常不是一个问题。

答案 1 :(得分:3)

我设置了与您相同的情况,它对我来说效果很好,因此您已经准备好了关键组件。有关测试和故障排除的一些注意事项:

您的web.config确实需要html扩展的构建提供程序:

<system.web>
    <compilation>
      <buildProviders>
        <add extension=".html"
             type="System.Web.Compilation.PageBuildProvider" />
      </buildProviders>
    </compilation>
</system.web>

您的处理程序的复制和粘贴对我有用,所以看起来不错。

虽然我在一个干净的项目中使用了默认的Home控制器,但MapRoute的复制和粘贴也适用于我。所以作为一个双重检查只是确认你有一个名为Topic的控制器,其中有一个名为Index()的ActionResult方法。

并确保您的网址是localhost.com:{port} / html / test.html,路径中包含/ html /,因为您的规则要求。

另一个好的测试是改变你的MapRoute来代替使用aspx并测试一个aspx页面,看看是否有效。这将确认它是否是IIS映射或者它是否是MVC规则。如果它与aspx一起工作,那么问题与处理程序有关,但是如果它也与aspx失败那么它就是MVC的东西。

同时确认您使用的是IIS Express,而不是Cassini。 Cassini无法正确处理,但IIS Express会。您可以通过右键单击项目来确认,您应该看到一个名为“使用Visual Studio Development Studio ...”的菜单选项。只有当前正在使用IIS Express时才会存在。