Razorビューエンジンでサーバー側インクルードを使用して.htmlまたは.aspファイルを含めることは可能ですか?すべてのWebサイトで使用されるWebサイトメニューを含む.htmlファイルと.aspファイルがあります。現在、すべてのサイトでサーバー側インクルードを使用しているため、mensuを1か所で変更するだけで済みます。
_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" -->"
Razorはサーバー側インクルードをサポートしていません。最も簡単な解決策は、メニューマークアップを_Layout.cshtmlページにコピーすることです。
.htmlファイルのみを含める必要がある場合は、おそらくディスクからファイルを読み取り、出力を書き込むカスタム関数を作成できます。
ただし、.aspファイル(任意のサーバー側コードを含む可能性がある)も含める必要があるため、上記のアプローチは機能しません。 .aspファイルを実行し、生成された出力をキャプチャし、cshtmlファイルの応答に書き出す方法が必要です。
この場合、コピーと貼り付けのアプローチを使用します
@Html.Raw(File.ReadAllText(Server.MapPath("~/content/somefile.css")))
Htmlページをcshtmlページにして、それを含めてみてください:
@RenderPage("_header.cshtml")
この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);
}
@RenderPage("PageHeader.cshtml")
<!-- your page body here -->
@RenderPage("PageFooter.cshtml")
これはうまく機能し、時間を大幅に節約できます。
少し古い答えで申し訳ありませんが、カミソリでaspファイルを添付する方法を見つけました。もちろん、いくつかのトリックを行う必要がありますが、うまくいきます!まず、.NET MVC 3アプリケーションを作成しました。
_Layout.cshtmlに次の行を追加しました。
@Html.Partial("InsertHelper")
次に、このコンテンツを使用して、共有フォルダーに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でパーシャルをレンダリングできるため、この例が機能しています。
そしてもう1つ、両方のaspxファイルに次の行を追加しないでください。
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
追加できるのは1回だけです!それが役に立てば幸い!
ファイルの内容を取得する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");
ただやる:
@Html.Partial("_SliderPartial")
「_SliderPartial」は「_SliderPartial.cshtml」ファイルであり、罰金です。
MVC 4に.inc
ファイルを含めようとしたときに同じ問題が発生しました。
この問題を解決するために、ファイルのサフィックスを.cshtml
に変更し、次の行を追加しました
@RenderPage("../../Includes/global-banner_v4.cshtml")
_Layout.cshtmlに次の行を追加しました。
@Html.Partial("InsertHelper")
次に、このコンテンツを使用して、共有フォルダーにInsertHelper.aspxを作成しました。
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<!--#include VIRTUAL="/ViewPage1.aspx"-->
使用するメニューに基づいてセクションをレンダリングできるセクションを_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.*@
}
以下のように、サーバー側コードとaspxファイルを.cshtmlファイルに含めてから、従来の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"-->
Includeを使用することは、mvcでメニューを使用する正しい方法ではありません。共有レイアウトおよび/または部分ビューを使用する必要があります。
ただし、何らかの奇妙な理由でhtmlファイルを含める必要がある場合は、次の方法を使用します。
Helpers/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")
文書化のためにこのようなファイルを含めたかった(ファイルの内容を<pre>タグに入れる)。
これを行うには、相対仮想パス(絶対仮想パスである必要はない)と、コンテンツをhtmlエンコードするかどうかを示すオプションのブール値を使用するメソッドでHtmlHelperExtensionを追加しました。主にコードを表示するために使用しています。
このコードを機能させるための本当の鍵は、 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);
}
}