c# - ASP.NET MVC C# Razor 缩小

标签 c# asp.net-mvc razor

有没有人知道如何在保持自定义编码风格的同时从 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 中创建自定义操作过滤器 witch clear 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
{
     ...
}

关于c# - ASP.NET MVC C# Razor 缩小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15877824/

相关文章:

c# - 将简单的 C# DLL 转换为 COM 互操作组件

jquery - 外部 javascript 不起作用,而内部 javascript 起作用

javascript - 如何访问 @URL.Action() 中的 javascript 变量

javascript - 混合 Razor 和 Javascript : Assigning a number from Model to a Javascript variable in a view

c# - Owin最大并发请求数

c# - C# 单元测试项目的 Web 前端

asp.net-mvc - Asp.net MVC授权属性,重定向到自定义 “no rights”页

asp.net-mvc - Html.Label、Html.LabelFor 和 Html.LabelForModel 之间有什么区别

c# - 我如何调用构造函数初始化器 base() 和 this()?

asp.net-mvc - 如何创建功能类似于 Webforms Wizards 的 MVC 'Wizard'?