web-dev-qa-db-fra.com

Comment inclure un fichier .html ou .asp à l'aide du rasoir?

Est-il possible d'utiliser l'inclusion côté serveur dans le moteur de vue Razor pour inclure un fichier .html ou .asp? Nous avons un fichier .html et des fichiers .asp qui contiennent des menus de site Web qui sont utilisés pour tous nos sites Web. Actuellement, nous utilisons l'inclusion côté serveur pour tous nos sites, de sorte que nous n'avons besoin que de changer le mensu en un seul endroit.

J'ai le code suivant dans le corps de mon _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>

Au lieu d'inclure le contenu du fichier, si je fais une vue source, je vois le texte littéral.

" <!--#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 ne prend pas en charge les inclusions côté serveur. La solution la plus simple serait de copier le balisage du menu dans votre page _Layout.cshtml.

Si vous n'aviez besoin que d'inclure des fichiers .html, vous pourriez probablement écrire une fonction personnalisée qui lit le fichier à partir du disque et écrit la sortie.

Cependant, puisque vous souhaitez également inclure des fichiers .asp (qui pourraient contenir du code côté serveur arbitraire), l'approche ci-dessus ne fonctionnera pas. Vous devez disposer d'un moyen pour exécuter le fichier .asp, capturer la sortie générée et l'écrire dans la réponse dans votre fichier cshtml.

Dans ce cas, j'opterais pour l'approche copier-coller

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

Essayez de faire de votre page html une page cshtml et de l'inclure avec:

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

Essayez d'implémenter cet assistant 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);
    }
}

ou:

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

Cela fonctionne très bien et peut vous faire gagner beaucoup de temps.

5
Stacked

Désolé les gars pour la vieille réponse mais j'ai trouvé un moyen de joindre un fichier asp avec un rasoir. Bien sûr, vous devez faire un tour mais cela fonctionne! J'ai tout d'abord créé l'application .NET MVC 3.

Dans mon _Layout.cshtml, j'ai ajouté la ligne suivante:

@Html.Partial("InsertHelper")

Ensuite, j'ai créé InsertHelper.aspx dans mon dossier partagé avec ce contenu:

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

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

ViewPage1.aspx est localisé dans mon répertoire racine, et a simplement pour vérifier si cela fonctionne:

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

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

Et il fonctionne!

Razor est capable de rendre des partiels avec différents ViewEngine, et c'est pourquoi cet exemple fonctionne.

Et encore une chose: n'oubliez pas de ne pas ajouter la ligne suivante dans les deux fichiers aspx:

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

Vous ne pouvez l'ajouter qu'une seule fois! J'espère que ça aide!

3
Karol

Créez une méthode d'extension HtmlHelper qui récupère le contenu des fichiers:

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

tilisation:

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

Faites juste:

@Html.Partial("_SliderPartial")

tandis que "_SliderPartial" est votre fichier "_SliderPartial.cshtml" et votre amende.

2
nova.cp

J'ai eu le même problème lorsque j'ai essayé d'inclure un .inc fichier dans MVC 4.

Pour résoudre ce problème, j'ai changé le suffixe du fichier en .cshtml et j'ai ajouté la ligne suivante

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

Dans mon _Layout.cshtml, j'ai ajouté la ligne suivante:

@Html.Partial("InsertHelper")

Ensuite, j'ai créé InsertHelper.aspx dans mon dossier partagé avec ce contenu:

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

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

Pourquoi ne pas inclure une section dans votre page _Layout.cshtml qui vous permettra de rendre les sections en fonction du menu que vous souhaitez utiliser.

_Layout.cshtml

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

Ensuite, dans n'importe quelle page qui utilise cette mise en page, vous aurez quelque chose comme ceci:

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

vous pouvez inclure le code côté serveur et le fichier aspx dans les fichiers .cshtml comme ci-dessous, puis inclure les fichiers asp classiques ou les fichiers html. Voici les étapes

  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
Rammohan Penchala

L'utilisation d'includes n'est pas la bonne façon d'utiliser les menus avec mvc. Vous devez utiliser une disposition partagée et/ou des vues partielles.

Cependant, si pour une raison étrange, vous devez inclure un fichier html, voici une façon de le faire.

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));
        }
    }
}

Ajouter un nouvel espace de noms à web.config

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

Usage:

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

Méthode d'extension Html.Include (relativeVirtualPath)

Je voulais inclure des fichiers comme celui-ci à des fins de documentation (mettre le contenu d'un fichier dans une balise <pre>).

Pour ce faire, j'ai ajouté un HtmlHelperExtension avec une méthode qui prend un chemin virtuel relatif (ne doit pas nécessairement être un chemin virtuel absolu) et un booléen facultatif pour indiquer si vous souhaitez encoder le contenu en HTML, ce que ma méthode fait par défaut depuis Je l'utilise principalement pour afficher du code.

La vraie clé pour faire fonctionner ce code était d'utiliser VirtualPathUtility ainsi que WebPageBase . Échantillon:

// 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);

Code HtmlHelperExtension complet:

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