你如何使用剃刀包含.html或.asp文件?

时间:2011-03-15 16:02:30

标签: asp.net-mvc-3 razor

是否可以在Razor视图引擎中使用服务器端包含.html或.asp文件?我们有一个.html文件和.asp文件,其中包含用于我们所有网站的网站菜单。目前我们在所有站点都使用服务器端包含,因此我们只需要在一个地方更改mensu。

我在_Layout.cshtml

的正文中有以下代码
<body>
<!--#include virtual="/serverside/menus/MainMenu.asp" -->   
<!--#include virtual="/serverside/menus/library_menu.asp" -->
<!--#include virtual="/portfolios/serverside/menus/portfolio_buttons_head.html" -->
@RenderBody()
</body>

除了包含文件内容外,如果我查看视图源,我会看到文字文本。

" <!--#include virtual="/serverside/menus/MainMenu.asp" --> 
    <!--#include virtual="/serverside/menus/library_menu.asp" -->
    <!--#include virtual="/portfolios/serverside/menus/portfolio_buttons_head.html" -->"

14 个答案:

答案 0 :(得分:86)

@Html.Raw(File.ReadAllText(Server.MapPath("~/content/somefile.css")))

答案 1 :(得分:58)

尝试将您的html页面设置为cshtml页面,并将其包含在:

@RenderPage("_header.cshtml")

答案 2 :(得分:8)

尝试实现此HTML帮助程序:

public static IHtmlString ServerSideInclude(this HtmlHelper helper, string serverPath)
{
    var filePath = HttpContext.Current.Server.MapPath(serverPath);

    // load from file
    using (var streamReader = File.OpenText(filePath))
    {
        var markup = streamReader.ReadToEnd();
        return new HtmlString(markup);
    }
}

或:

public static IHtmlString ServerSideInclude(this HtmlHelper helper, string serverPath)
{
    var filePath = HttpContext.Current.Server.MapPath(serverPath);

    var markup = File.ReadAllText(filePath);
    return new HtmlString(markup);
}

答案 3 :(得分:5)

Razor不支持服务器端包含。最简单的解决方案是将菜单标记复制到_Layout.cshtml页面中。

如果您只需要包含.html文件,您可以编写一个自定义函数,从磁盘读取文件并写入输出。

但是,由于您还想包含.asp文件(可能包含任意服务器端代码),因此上述方法无效。您必须有办法执行.asp文件,捕获生成的输出,并将其写入cshtml文件中的响应。

在这种情况下,我会选择复制+粘贴方法

答案 4 :(得分:5)

@RenderPage("PageHeader.cshtml")
<!-- your page body here -->
@RenderPage("PageFooter.cshtml")

这很好用,可以为你节省很多时间。

答案 5 :(得分:3)

创建一个获取文件内容的HtmlHelper扩展方法:

public static class HtmlHelpers
{
  public static MvcHtmlString WebPage(this HtmlHelper htmlHelper, string url)
  {
    return MvcHtmlString.Create(new WebClient().DownloadString(url));
  }
}

<强>用法:

@Html.WebPage("/serverside/menus/MainMenu.asp");

答案 6 :(得分:3)

对不起家伙有点老答案,但我找到了一些用剃刀附加asp文件的方法。当然你需要做一些技巧但它有效!首先,我创建了.NET MVC 3应用程序。

在我的_Layout.cshtml中,我添加了以下行:

@Html.Partial("InsertHelper")

然后我在我的Shared文件夹中使用以下内容创建了InsertHelper.aspx:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

<!--#include VIRTUAL="/ViewPage1.aspx"-->

ViewPage1.aspx位于我的根目录中,只是简单地检查它是否有效:

<%
string dummy;
dummy="nz";
%>

<% if (dummy == "nz") { %>
nz indeed
<% } else { %>
not nz
<% } %>

它有效!

Razor能够使用不同的ViewEngine渲染局部视图,这就是这个例子有效的原因。

还有一件事:记住不要在两个aspx文件中添加以下行:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

您只能添加一次!希望它有所帮助!

答案 7 :(得分:2)

当我尝试在MVC 4中包含.inc文件时,我遇到了同样的问题。

要解决此问题,我将文件的后缀更改为.cshtml,并添加了以下行

@RenderPage("../../Includes/global-banner_v4.cshtml")

答案 8 :(得分:2)

在我的_Layout.cshtml中,我添加了以下行:

@Html.Partial("InsertHelper")

然后我在我的Shared文件夹中使用以下内容创建了InsertHelper.aspx:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>

<!--#include VIRTUAL="/ViewPage1.aspx"-->

答案 9 :(得分:2)

只是做:

@Html.Partial("_SliderPartial")

while&#34; _SliderPartial&#34;是你的&#34; _SliderPartial.cshtml&#34;文件和你的罚款。

答案 10 :(得分:1)

为什么不在_Layout.cshtml页面中包含一个部分,允许您根据要使用的菜单呈现部分。

_Layout.cshtml

<!-- Some stuff. -->
@RenderSection("BannerContent")
<!-- Some other stuff -->

然后,在任何使用该布局的页面中,您将拥有以下内容:

@section BannerContent 
{
  @*Place your ASP.NET and HTML within this section to create/render your menus.*@
}

答案 11 :(得分:1)

您可以在.cshtml文件中包含服务器端代码和aspx文件,如下所示,然后包含经典的asp文件或html文件。 以下是步骤

  1. Index.cshtml
  2. @Html.RenderPartial("InsertASPCodeHelper")

    2.InsertASPCodeHelper.aspx

    <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
    <!--#include VIRTUAL="~/Views/Shared/Header.aspx"-->
    
    1. Header.aspx
    2. <!--#include file="/header/header.inc"-->
      

答案 12 :(得分:0)

使用includes不是使用mvc菜单的正确方法。您应该使用共享布局和/或部分视图。

但是,如果由于某些奇怪的原因,你必须包含一个html文件,这是一种方法。

助手/ HtmlHelperExtensions.cs

using System.Web;
using System.Web.Mvc;
using System.Net;

namespace MvcHtmlHelpers
{
    public static class HtmlHelperExtensions
    {
        public static MvcHtmlString WebPage(this HtmlHelper htmlHelper, string serverPath)
        {
            var filePath = HttpContext.Current.Server.MapPath(serverPath);
            return MvcHtmlString.Create(new WebClient().DownloadString(filePath));
        }
    }
}

将新命名空间添加到web.config

<pages pageBaseType="System.Web.Mvc.WebViewPage">
  <namespaces>
    <add namespace="MvcHtmlHelpers"/>
  </namespaces>
</pages>

用法:

@Html.WebPage("/Content/pages/home.html")

答案 13 :(得分:0)

Html.Include(relativeVirtualPath)扩展方法

我想包含这样的文件用于文档目的(将文件的内容放在&lt; pre&gt;标记中)。

为此,我添加了一个HtmlHelperExtension,其方法采用相对虚拟路径(不必是绝对虚拟路径)和可选的布尔值来指示是否要对内容进行html编码,默认我的方法,因为我主要使用它来显示代码。

使此代码正常运行的真正关键是使用VirtualPathUtility以及WebPageBase。样品:

// Assume we are dealing with Razor as WebPageBase is the base page for razor.
// Making this assumption we can get the virtual path of the view currently
// executing (will return partial view virtual path or primary view virtual
// path just depending on what is executing).
var virtualDirectory = VirtualPathUtility.GetDirectory(
   ((WebPageBase)htmlHelper.ViewDataContainer).VirtualPath);

完整的HtmlHelperExtension代码:

public static class HtmlHelperExtensions
{
    private static readonly IEnumerable<string> IncludeFileSupportedExtensions = new String[]
    {
        ".resource",
        ".cshtml",
        ".vbhtml",
    };

    public static IHtmlString IncludeFile(
       this HtmlHelper htmlHelper, 
       string virtualFilePath, 
       bool htmlEncode = true)
    {
        var virtualDirectory = VirtualPathUtility.GetDirectory(
            ((WebPageBase)htmlHelper.ViewDataContainer).VirtualPath);
        var fullVirtualPath = VirtualPathUtility.Combine(
            virtualDirectory, virtualFilePath);
        var filePath = htmlHelper.ViewContext.HttpContext.Server.MapPath(
            fullVirtualPath);

        if (File.Exists(filePath))
        {
            return GetHtmlString(File.ReadAllText(filePath), htmlEncode);
        }
        foreach (var includeFileExtension in IncludeFileSupportedExtensions)
        {
            var filePathWithExtension = filePath + includeFileExtension;
            if (File.Exists(filePathWithExtension))
            {
                return GetHtmlString(File.ReadAllText(filePathWithExtension), htmlEncode);
            }
        }
        throw new ArgumentException(string.Format(
@"Could not find path for ""{0}"".
Virtual Directory: ""{1}""
Full Virtual Path: ""{2}""
File Path: ""{3}""",
                    virtualFilePath, virtualDirectory, fullVirtualPath, filePath));
    }

    private static IHtmlString GetHtmlString(string str, bool htmlEncode)
    {
        return htmlEncode
            ? new HtmlString(HttpUtility.HtmlEncode(str))
            : new HtmlString(str);
    }
}