簡體   English   中英

ASP.NET MVC C#Razor Minification

[英]ASP.NET MVC C# Razor Minification

有沒有人知道如何在保持自定義編碼樣式的同時從Razor引擎輸出縮小的HTML和JavaScript?

例如:我想要以下代碼:

<div
    @if (Model.Name != string.Empty)
        @:id="@Model.Name"
>
</div>

輸出為<div id="DivId"></div>

請查看http://arranmaclean.wordpress.com/2010/08/10/minify-html-with-net-mvc-actionfilter/ 有一個例子可以從WhiteSpaces創建自定義動作過濾器清除html

更新 :上面引用的源代碼。

用於刪除“空白”的流類

using System;
using System.IO;
using System.Text;
using System.Web.Mvc;
using System.Text.RegularExpressions;

namespace RemoveWhiteSpace.ActionFilters
{
    public class WhiteSpaceFilter : Stream
    {

        private Stream _shrink;
        private Func<string, string> _filter;

        public WhiteSpaceFilter(Stream shrink, Func<string, string> filter)
        {
            _shrink = shrink;
            _filter = filter;
        }


        public override bool CanRead { get { return true; } }
        public override bool CanSeek { get { return true; } }
        public override bool CanWrite { get { return true; } }
        public override void Flush() { _shrink.Flush(); }
        public override long Length { get { return 0; } }
        public override long Position { get; set; }
        public override int Read(byte[] buffer, int offset, int count)
        {
            return _shrink.Read(buffer, offset, count);
        }
        public override long Seek(long offset, SeekOrigin origin)
        {
            return _shrink.Seek(offset, origin);
        }
        public override void SetLength(long value)
        {
            _shrink.SetLength(value);
        }
        public override void Close()
        {
            _shrink.Close();
        }

        public override void Write(byte[] buffer, int offset, int count)
        {
            // capture the data and convert to string 
            byte[] data = new byte[count];
            Buffer.BlockCopy(buffer, offset, data, 0, count);
            string s = Encoding.Default.GetString(buffer);

            // filter the string
            s = _filter(s);

            // write the data to stream 
            byte[] outdata = Encoding.Default.GetBytes(s);
            _shrink.Write(outdata, 0, outdata.GetLength(0));
        }
    }
}

ActionFilter類:

public class WhitespaceFilterAttribute : ActionFilterAttribute
{

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        var request = filterContext.HttpContext.Request;
        var response = filterContext.HttpContext.Response;

        response.Filter = new WhiteSpaceFilter(response.Filter, s =>
                {
                    s = Regex.Replace(s, @"\s+", " ");
                    s = Regex.Replace(s, @"\s*\n\s*", "\n");
                    s = Regex.Replace(s, @"\s*\>\s*\<\s*", "><");
                    s = Regex.Replace(s, @"<!--(.*?)-->", "");   //Remove comments

                    // single-line doctype must be preserved 
                    var firstEndBracketPosition = s.IndexOf(">");
                    if (firstEndBracketPosition >= 0)
                    {
                        s = s.Remove(firstEndBracketPosition, 1);
                        s = s.Insert(firstEndBracketPosition, ">");
                    }
                    return s;
                });

        }

}

並最終使用上述:

[HandleError]
[WhitespaceFilter]
public class HomeController : Controller
{
     ...
}

我認為沒有辦法實現這一目標。 為了避免標簽湯,我通常更喜歡寫自定義助手:

@using(Html.MyDiv(Model.Name))
{
    ... put the contents of the div here
}

以下是自定義幫助程序的外觀:

public static class HtmlExtensions
{
    private class Div : IDisposable
    {
        private readonly ViewContext context;
        private bool disposed;

        public Div(ViewContext context)
        {
            this.context = context;
        }

        public void Dispose()
        {
            this.Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                this.disposed = true;
                context.Writer.Write("</div>");
            }
        }
    }

    public static IDisposable MyDiv(this HtmlHelper html, string id)
    {
        var div = new TagBuilder("div");
        if (!string.IsNullOrEmpty(id))
        {
            div.GenerateId(id);
        }
        html.ViewContext.Writer.Write(div.ToString(TagRenderMode.StartTag));
        return new Div(html.ViewContext);            
    }
}

或者你也可以做一個標簽湯:

<div@Html.Raw(Model.Name != string.Empty ? string.Format(" id=\"{0}\"", Html.AttributeEncode(Model.Name)) : string.Empty)>
</div>

也許您正在尋找Meleze.Web

Meleze.Web是一個優化ASP.NET MVC 3.0和MVC 4.0應用程序的工具箱。
它提供了Razor視圖的HTML,JS和CSS縮小以及返回頁面的緩存。

Darin Dimitrov在這里寫到: ASP.Net MVC Razor Views - 在構建時縮小HTML

但我認為啟用gzip是更好的解決方案,你可以在這里閱讀: 從ASP.Net MVC應用程序中簡化HTML輸出

對於任何對此感興趣的人,我構建了一個可以與MVC 5一起使用的簡單HTML縮小庫:

https://github.com/tompazourek/RazorHtmlMinifier.Mvc5

它在編譯時而不是運行時運行,因此不會增加任何性能開銷。 縮小非常簡單(只需用一個空格替換大量空格)。

即使在縮小的HTML之上啟用了GZIP,它仍然可以減少有效負載大小

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM