Comment intégrez-vous.html ou.un fichier asp avec razor?
est-il possible d'utiliser côté serveur include dans le moteur de vue de rasoir pour inclure .html ou .dossier asp? Nous avons une .fichier html et .les fichiers asp qui contiennent des menus de site web qui sont utilisés pour tous nos sites web. Actuellement, nous utilisons le côté serveur include pour tous nos sites de sorte que nous n'avons besoin de changer le mensu qu'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 voir 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" -->"
14 réponses
Razor ne supporte pas les Inclusions Côté Serveur. La solution la plus simple serait de copier le markup du menu dans votre _Layout.CSHTML page.
si vous avez seulement besoin d'inclure .fichiers html vous pourriez probablement écrire une fonction personnalisée qui lit le fichier à partir du disque et a écrit la sortie.
cependant puisque vous voulez aussi inclure .les fichiers asp (qui peuvent contenir du code arbitraire côté serveur) l'approche ci-dessus ne fonctionnera pas. Vous devez avoir un moyen d'exécuter le .fichier asp, capturez la sortie générée, et écrivez-la à la réponse dans votre fichier cshtml.
dans ce cas, j'utiliserais l'approche copier+coller
@Html.Raw(File.ReadAllText(Server.MapPath("~/content/somefile.css")))
essayez de faire de votre page html une page cshtml et de l'inclure avec:
@RenderPage("_header.cshtml")
essayez d'implémenter ce helper 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);
}
@RenderPage("PageHeader.cshtml")
<!-- your page body here -->
@RenderPage("PageFooter.cshtml")
Cela fonctionne bien et peut vous faire économiser beaucoup de temps.
Créer un HtmlHelper méthode d'extension qui obtient le contenu des fichiers:
public static class HtmlHelpers
{
public static MvcHtmlString WebPage(this HtmlHelper htmlHelper, string url)
{
return MvcHtmlString.Create(new WebClient().DownloadString(url));
}
}
Utilisation:
@Html.WebPage("/serverside/menus/MainMenu.asp");
Désolé les gars pour réponse un peu vieille, mais j'ai trouvé un moyen de joindre le fichier asp avec le rasoir. Bien sûr, vous avez besoin de faire quelque chose, mais il fonctionne! Tout d'abord, J'ai créé L'application .NET MVC 3.
Dans mon _Layout.cshtml j'ai ajouté la ligne suivante:
@Html.Partial("InsertHelper")
puis 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 juste simple si pour vérifier si elle fonctionne:
<%
string dummy;
dummy="nz";
%>
<% if (dummy == "nz") { %>
nz indeed
<% } else { %>
not nz
<% } %>
et ça marche!
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! Espérons que cela aide!
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 à .cshtml
et j'ai ajouté la ligne suivante
@RenderPage("../../Includes/global-banner_v4.cshtml")
Juste à faire:
@Html.Partial("_SliderPartial")
alors que " _SliderPartial "est votre" _SliderPartial.fichier cshtml" et votre amende.
Dans mon _Layout.cshtml j'ai ajouté la ligne suivante:
@Html.Partial("InsertHelper")
puis J'ai créé InsertHelper.aspx dans mon dossier Partagé avec ce contenu:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<!--#include VIRTUAL="/ViewPage1.aspx"-->
pourquoi ne pas inclure une section dans votre _Layout.page cshtml qui vous permettra de rendre des sections en fonction du menu que vous voulez utiliser.
_Layout.cshtml
<!-- Some stuff. -->
@RenderSection("BannerContent")
<!-- Some other stuff -->
Puis, dans une page qui utilise cette disposition, vous aurez quelque chose comme ceci:
@section BannerContent
{
@*Place your ASP.NET and HTML within this section to create/render your menus.*@
}
vous pouvez inclure le code côté serveur et le fichier aspx .les fichiers cshtml comme ci-dessous et puis inclure des fichiers asp classiques ou des fichiers html. Voici les étapes
- Index.cshtml
@Html.RenderPartial("InsertASPCodeHelper")
2.InsertASPCodeHelper.aspx
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<!--#include VIRTUAL="~/Views/Shared/Header.aspx"-->
- en-Tête.aspx
<!--#include file="/header/header.inc"-->
utiliser includes n'est pas la bonne façon d'utiliser les menus avec mvc. Vous devez utiliser une mise en page partagée et/ou des vues partielles.
Toutefois, si pour une raison étrange, vous devez inclure un fichier html, voici un moyen 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 au web.config
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="MvcHtmlHelpers"/>
</namespaces>
</pages>
Utilisation:
@Html.WebPage("/Content/pages/home.html")
Html.Inclure (relativeVirtualPath) la méthode D'Extension
je voulais inclure des fichiers comme ceci à des fins de documentation (mettre le contenu d'un fichier dans une balise
).pour ce faire j'ai ajouté un HtmlHelperExtension avec une méthode qui prend un chemin virtuel relatif (ne doit pas être un chemin virtuel absolu) et un booléen optionnel pour indiquer si vous souhaitez encoder le contenu html, ce que fait par défaut ma méthode puisque je l'utilise principalement pour montrer code.
la vraie clé pour faire fonctionner ce code était d'utiliser le
VirtualPathUtility
ainsi queWebPageBase
. Exemple:// 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);
Plein HtmlHelperExtension Code:
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); } }