Подтвердить что ты не робот

Как включить файл .html или .asp с помощью бритвы?

Возможно ли использовать серверную часть в движке просмотра 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" -->"
4b9b3361

Ответ 1

Razor не поддерживает серверную часть. Самое простое решение - копирование разметки меню на страницу _Layout.cshtml.

Если вам нужно было только включить файлы .html, вы, вероятно, могли бы написать пользовательскую функцию, которая читала бы файл с диска и записывала вывод.

Однако, поскольку вы также хотите включить файлы .asp(которые могут содержать произвольный код на стороне сервера), вышеуказанный подход не будет работать. Вам нужно было бы запустить файл .asp, захватить сгенерированный вывод и записать его в ответ в файле cshtml.

В этом случае я бы пошел с подходом copy + paste

Ответ 2

@Html.Raw(File.ReadAllText(Server.MapPath("~/content/somefile.css")))

Ответ 3

Попробуйте сделать вашу страницу html на странице cshtml и включить ее с помощью:

@RenderPage("_header.cshtml")

Ответ 4

Попробуйте реализовать этот помощник 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);
}

Ответ 5

@RenderPage("PageHeader.cshtml")
<!-- your page body here -->
@RenderPage("PageFooter.cshtml")

Это работает отлично и может сэкономить вам много времени.

Ответ 6

Создайте метод расширения 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");

Ответ 7

Извините, парни за бит старый ответ, но я нашел способ подключить 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 и почему этот пример работает.

И еще одно: не забудьте добавить следующую строку в оба файла aspx:

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

Вы можете добавить его только один раз! Надеюсь, это поможет!

Ответ 8

У меня была такая же проблема, когда я попытался включить файл .inc в MVC 4.

Чтобы решить эту проблему, я изменил суффикс файла на .cshtml, и я добавил следующую строку

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

Ответ 9

В моем _Layout.cshtml я добавил следующую строку:

@Html.Partial("InsertHelper")

Затем я создал InsertHelper.aspx в моей общей папке с этим контентом:

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

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

Ответ 10

Почему бы не включить раздел на странице _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

Использование include - это не правильный способ использования меню с 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")

Ответ 12

Html.Include(relativeVirtualPath) Метод расширения

Я хотел включить файлы, подобные этому, для целей документации (помещая содержимое файла в тег <pre> ).

Для этого я добавил 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 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);
    }
}

Ответ 13

Просто выполните:

@Html.Partial("_SliderPartial")

в то время как "_SliderPartial" является вашим файлом "_SliderPartial.cshtml" и вашим штрафом.

Ответ 14

вы можете включить код на стороне сервера и файл aspx в .cshtml файлы, как показано ниже, а затем включить в классические asp файлы или html файлы. Вот шаги

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