Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
缩小ASP.NETMVC应用程序的HTML输出_Asp.net_Asp.net Mvc_Minify_Asp.net Mvc Views - Fatal编程技术网

缩小ASP.NETMVC应用程序的HTML输出

缩小ASP.NETMVC应用程序的HTML输出,asp.net,asp.net-mvc,minify,asp.net-mvc-views,Asp.net,Asp.net Mvc,Minify,Asp.net Mvc Views,这可能与下面的问题重复,但唯一的答案是死链接: 在使用ASP.Net时,我最讨厌的一个方面是VisualStudio使用空格而不是制表符来表示白间距,这会增加最终HTML的大小。我最初只想简单地将VisualStudio设置更改为使用选项卡,但我团队中的其他人最终还是会覆盖空格 我的问题有两个:第一,如果使用空格或制表符,是否有办法更改每个项目的设置(如果使用空格或制表符,是否值得更改);第二,是否有办法在生成视图时缩小所有视图?无论如何,将比缩小HTML更有效 在运行时进行缩小可能会损害您的

这可能与下面的问题重复,但唯一的答案是死链接:

在使用ASP.Net时,我最讨厌的一个方面是VisualStudio使用空格而不是制表符来表示白间距,这会增加最终HTML的大小。我最初只想简单地将VisualStudio设置更改为使用选项卡,但我团队中的其他人最终还是会覆盖空格

我的问题有两个:第一,如果使用空格或制表符,是否有办法更改每个项目的设置(如果使用空格或制表符,是否值得更改);第二,是否有办法在生成视图时缩小所有视图?

无论如何,将比缩小HTML更有效

在运行时进行缩小可能会损害您的服务器(假设您不使用缓存)。在部署期间最小化Asp.Net标记可能是一个好主意。这样,您的代码存储库中仍然有一个非精简版本的代码,服务器上仍然有一个精简版本。设想一个部署过程,在该过程中,您在所有
.aspx
文件上调用HTML缩略器(例如,看起来很有希望)。

有效(从您提供的相关链接)。它有一个解决方案,让您可以用缩小HTML的解决方案替换
WebRazorHostFactory

要使其正常工作,必须在
Web.config
文件中添加以下内容:

<system.web.webPages.razor>
  <host factoryType="Omari.Web.Mvc.WhiteSpaceCleaningMvcWebRazorHostFactory, WhiteSpaceCleanerForWebFormsAndMVC3" />
</system.web.webPages.razor>


此部分通常放在
Views\Web.config
中,我建议您尝试一下。文档可在-

谷歌Pagespeed会喜欢这个:

我为此奋斗了一段时间,我发现最好的方法是结合以下几点:

您可以使用我的助手类。它使用来最小化HTML,并使用
System.Web.Optimization
的绑定来最小化内联javascript和CSS(对于您的关键CSS 0.0)

谷歌HtmlCompressor库的.NET端口,用于缩小HTML源代码 代码

现在,您可以压缩和缩小您的html与内联css和javascript正在缩小以及!!太棒了!;)


希望有人觉得这有用。

这是一个老问题,但我会抛出我的解决方案,以防它对其他人有利

我有一个“缩小”过滤器,它使用的正则表达式大部分都有效。在
pre
textarea
标记中保留空白时,它失败了。几天前我因为它撞到了墙,所以我花了大约三天的时间阅读别人的尝试,并尝试我的想法。最后,我决定使用HtmlAgilityPack解析HTML,并从中删除空白节点。因为HAP不认为
pre
textarea
元素中的空格是空格,所以它对我有利,并且完全符合我的要求。一开始我确实遇到了麻烦,因为HTML是分块发送的,但我通过缓冲直到完成来解决它。这是我的代码,以防对其他人有益

请注意,此筛选器在我的应用程序(ASP.NET MVC 5)中适用。理想情况下,应该在发布过程中进行缩小,以避免需要这样的过滤器。最后,@naivists在他的回答中指出,GZIP压缩响应比缩小响应效果更好,但我稍微不同意他的观点。是的,会的,但缩小确实会稍微降低响应。它真正的亮点在于使用CSS设计样式,因为现在您不必担心空格碰撞和元素错位,也不必使用边距/填充/定位技巧来纠正它

[AttributeUsage(AttributeTargets.Class, Inherited = false)]
internal sealed class MinifyHtmlAttribute :
    ActionFilterAttribute {
    public override void OnActionExecuted(
        ActionExecutedContext filterContext) {
        if (filterContext == null
            || filterContext.IsChildAction) {
            return;
        }

        filterContext.HttpContext.Response.Filter = new MinifyHtmlStream(filterContext.HttpContext);
    }
}

internal sealed class MinifyHtmlStream :
    MemoryStream {
    private readonly MemoryStream BufferStream;
    private readonly HttpContextBase Context;
    private readonly Stream FilterStream;

    public MinifyHtmlStream(
        HttpContextBase httpContextBase) {
        BufferStream = new MemoryStream();
        Context = httpContextBase;
        FilterStream = httpContextBase.Response.Filter;
    }

    public override void Flush() {
        BufferStream.Seek(0, SeekOrigin.Begin);

        if (Context.Response.ContentType != "text/html") {
            BufferStream.CopyTo(FilterStream);

            return;
        }

        var document = new HtmlDocument();

        document.Load(BufferStream);

        var spans = document.DocumentNode.Descendants().Where(
            d =>
                d.NodeType == HtmlNodeType.Element
                && d.Name == "span").SelectMany(
            d => d.ChildNodes.Where(
                cn => cn.NodeType == HtmlNodeType.Text)).ToList();

        //  Some spans have content that needs to be trimmed.
        foreach (var span in spans) {
            span.InnerHtml = span.InnerHtml.Trim();
        }

        var nodes = document.DocumentNode.Descendants().Where(
            d =>
                (d.NodeType == HtmlNodeType.Text
                && d.InnerText.Trim().Length == 0)
                || (d.NodeType == HtmlNodeType.Comment
                && d.InnerText.Trim() != "<!DOCTYPE html>")).Select(
            d => d).ToList();

        foreach (var node in nodes) {
            node.Remove();
        }

        document.Save(FilterStream);
    }

    public override void Write(
        byte[] buffer,
        int offset,
        int count) {
        BufferStream.Write(buffer, offset, count);
    }
}
[AttributeUsage(AttributeTargets.Class,继承=false)]
内部密封类MinifyHtmlAttribute:
ActionFilterAttribute{
已执行公共覆盖无效操作(
ActionExecutedContext筛选器(上下文){
如果(filterContext==null
||filterContext.IsChildAction){
返回;
}
filterContext.HttpContext.Response.Filter=新的MinifyHtmlStream(filterContext.HttpContext);
}
}
内部密封级MinifyHtmlStream:
记忆流{
私有只读存储器流缓冲流;
私有只读HttpContextBase上下文;
私有只读流过滤器;
公共小型工作流(
HttpContextBase(HttpContextBase){
BufferStream=newmemoryStream();
Context=httpContextBase;
FilterStream=httpContextBase.Response.Filter;
}
公共覆盖无效刷新(){
Seek(0,SeekOrigin.Begin);
if(Context.Response.ContentType!=“text/html”){
CopyTo(FilterStream);
返回;
}
var document=新的HtmlDocument();
文件加载(缓冲流);
var span=document.DocumentNode.subjects()。其中(
d=>
d、 NodeType==HtmlNodeType.Element
&&d.名称==“span”)。选择多个(
d=>d.ChildNodes.Where(
cn=>cn.NodeType==HtmlNodeType.Text)).ToList();
//某些跨距包含需要修剪的内容。
foreach(跨度中的变量跨度){
span.InnerHtml=span.InnerHtml.Trim();
}
var节点=document.DocumentNode.subjects()。其中(
d=>
(d.NodeType==HtmlNodeType.Text
&&d.InnerText.Trim().Length==0)
||(d.NodeType==HtmlNodeType.Comment
&&d.InnerText.Trim()!=“”)。选择(
d=>d.ToList();
foreach(节点中的var节点){
node.Remove();
}
文件保存(FilterStream);
}
公共覆盖无效写入(
字节[]缓冲区,
整数偏移,
整数计数){
写入(缓冲区、偏移量、计数);
}
}

+1。您应该在上压缩输出