是否可以在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" -->"
答案 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文件。 以下是步骤
@Html.RenderPartial("InsertASPCodeHelper")
2.InsertASPCodeHelper.aspx
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<!--#include VIRTUAL="~/Views/Shared/Header.aspx"-->
<!--#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)
我想包含这样的文件用于文档目的(将文件的内容放在&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);
}
}