web-dev-qa-db-ja.com

かみそりを使用して.htmlまたは.aspファイルを含めるにはどうすればよいですか?

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" -->"
34
atbebtg

Razorはサーバー側インクルードをサポートしていません。最も簡単な解決策は、メニューマークアップを_Layout.cshtmlページにコピーすることです。

.htmlファイルのみを含める必要がある場合は、おそらくディスクからファイルを読み取り、出力を書き込むカスタム関数を作成できます。

ただし、.aspファイル(任意のサーバー側コードを含む可能性がある)も含める必要があるため、上記のアプローチは機能しません。 .aspファイルを実行し、生成された出力をキャプチャし、cshtmlファイルの応答に書き出す方法が必要です。

この場合、コピーと貼り付けのアプローチを使用します

5
marcind
@Html.Raw(File.ReadAllText(Server.MapPath("~/content/somefile.css")))
87
Mads Klinkby

Htmlページをcshtmlページにして、それを含めてみてください:

@RenderPage("_header.cshtml")
59
Deany WebGeek

この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);
}
8
John Hann
@RenderPage("PageHeader.cshtml")
<!-- your page body here -->
@RenderPage("PageFooter.cshtml")

これはうまく機能し、時間を大幅に節約できます。

5
Stacked

少し古い答えで申し訳ありませんが、カミソリで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回だけです!それが役に立てば幸い!

3
Karol

ファイルの内容を取得する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");
3
carlsb3rg

ただやる:

@Html.Partial("_SliderPartial")

「_SliderPartial」は「_SliderPartial.cshtml」ファイルであり、罰金です。

2
nova.cp

MVC 4に.incファイルを含めようとしたときに同じ問題が発生しました。

この問題を解決するために、ファイルのサフィックスを.cshtmlに変更し、次の行を追加しました

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

_Layout.cshtmlに次の行を追加しました。

@Html.Partial("InsertHelper")

次に、このコンテンツを使用して、共有フォルダーにInsertHelper.aspxを作成しました。

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

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

使用するメニューに基づいてセクションをレンダリングできるセクションを_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.*@
}
1
JasCav

以下のように、サーバー側コードとaspxファイルを.cshtmlファイルに含めてから、従来のaspファイルまたはhtmlファイルを含めることができます。手順は次のとおりです

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

2.InsertASPCodeHelper.aspx

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

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")
0
mikesl

Html.Include(relativeVirtualPath)拡張メソッド

文書化のためにこのようなファイルを含めたかった(ファイルの内容を<pre>タグに入れる)。

これを行うには、相対仮想パス(絶対仮想パスである必要はない)と、コンテンツをhtmlエンコードするかどうかを示すオプションのブール値を使用するメソッドでHtmlHelperExtensionを追加しました。主にコードを表示するために使用しています。

このコードを機能させるための本当の鍵は、 VirtualPathUtilityWebPageBase を使用することでした。サンプル:

// 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);
    }
}
0
Sam