【问题标题】:How can I remove white-spaces from ASP.NET MVC# output?如何从 ASP.NET MVC# 输出中删除空格?
【发布时间】:2016-02-08 22:18:45
【问题描述】:

如何从 ASP.NET MVC 3 输出中删除所有空格?


更新: 我知道如何使用 string.Replace 方法或正则表达式从字符串中删除空格;但我不知道,如何在 ASP.NET MVC 3 中使用主题从输出字符串中删除所有空格。例如,当“OnResultExecuted”方法被调用,并且结果准备好发送到最终用户的浏览器时,我想获得结果——作为一个字符串,或者一个流对象;他们之间没有区别 - 并为此做好我的工作。 谢谢大家。 :)

【问题讨论】:

  • 如果我对 Javad 的理解正确,那么问题是关于从整个页面的最终 HTML 输出中删除额外的空格。调出msn.com,看看源码,就一目了然了。我认为 IIS 压缩将解决帮助问题,但必须通过剥离空白获得更多收益,否则 msn.com 将不会这样做。在 Web 表单中,我们使用模块来完成此操作。不确定所有钩子是否仍然存在于 MVC 中。 codeproject.com/Articles/38067/…
  • 我发现了以下stackoverflow问题:stackoverflow.com/questions/2935657/…

标签: asp.net-mvc-3


【解决方案1】:

我找到了答案并创建了一个像这样的最终解决方案:

首先创建一个基类来强制视图从它继承,如下所示,并覆盖一些方法:

  public abstract class KavandViewPage < TModel > : System.Web.Mvc.WebViewPage < TModel > {

      public override void Write(object value) {
          if (value != null) {
              var html = value.ToString();
              html = REGEX_TAGS.Replace(html, "> <");
              html = REGEX_ALL.Replace(html, " ");
              if (value is MvcHtmlString) value = new MvcHtmlString(html);
              else value = html;
      }
      base.Write(value);
  }

  public override void WriteLiteral(object value) {
      if (value != null) {
          var html = value.ToString();
          html = REGEX_TAGS.Replace(html, "> <");
          html = REGEX_ALL.Replace(html, " ");
          if (value is MvcHtmlString) value = new MvcHtmlString(html);
          else value = html;
      }
      base.WriteLiteral(value);
  }

  private static readonly Regex REGEX_TAGS = new Regex(@">\s+<", RegexOptions.Compiled);
  private static readonly Regex REGEX_ALL = new Regex(@"\s+|\t\s+|\n\s+|\r\s+", RegexOptions.Compiled);

  }

然后我们应该对位于 Views 文件夹 -see here for more details 中的 web.config 文件进行一些更改。

    <system.web.webPages.razor>
      <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <pages pageBaseType="Kavand.Web.Mvc.KavandViewPage"> <!-- pay attention to here -->
        <namespaces>
          <add namespace="System.Web.Mvc" />
          ....
        </namespaces>
      </pages>
    </system.web.webPages.razor>

【讨论】:

  • 太棒了!我看到的唯一问题是捆绑,但我不喜欢 MVC 这样做的方式,所以我正在使用它。谢谢+1
  • 因为现在同时存在 HtmlString 和 MvcHtmlString 类型,所以我将 if (typeof 行修改为 if (typeof(HtmlString).IsAssignableFrom(value.GetType()))。此更改使您的解决方案可以在我的 MVC5 项目中完美运行,其中这两种类型可以互换使用(MvcHtmlString 继承自较新的 HtmlString)。
  • 我替换 if (typeof... with if (value is MvcHtmlString) value = new MvcHtmlString(html); else if (value is HtmlString) value = new HtmlString(html); else value = html ;
  • 这个处理&lt;pre&gt; valid spaces we don't want to remove &lt;/pre&gt;
  • @JeffFischer 谢谢你的意见。我会更新答案。
【解决方案2】:

一种方法是创建自定义视图页面的继承;其中,覆盖Write()方法(将创建3个方法),并在这些方法中将objects转换为strings,删除空格,最后调用base.Write()

【讨论】:

  • 我做这个Saman,我会尽快把我的最终代码放在这里;谢谢;
【解决方案3】:

您可以使用String.Replace 方法:

string input = "This is  text with   ";
string result = input.Replace(" ", "");

如果您还想删除制表符和换行符,请使用正则表达式:

string input = "This is   text with   far  too   much \t  " + Environment.NewLine +
               "whitespace.";
string result = Regex.Replace(input, "\\s+", "");

【讨论】:

  • 谢谢亲爱的 Darin Dimitrov,但我知道这一点,我想在页面呈现时从输出字符串中删除空格到浏览器。例如,当调用“OnResultExecuted”方法并且结果为准备发送给最终用户。再次感谢您的帮助。
【解决方案4】:
 Str = Str.Replace(" ", "");

应该可以解决问题。

【讨论】:

  • 不,亲爱的;我知道如何使用 String.Replace 方法,请再次阅读我的问题;但是我找到了答案。
  • 嗯,不知道你为什么在几个月后评论这个,但如果你看看我发布我的答案的时间,你需要很长一段时间才能用任何有用的信息真正更新问题。
猜你喜欢
  • 1970-01-01
  • 2021-07-29
  • 2017-11-03
  • 2022-12-16
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多