0

HtmlTextWriter.WriteLine(format, params object[] args) を使用して Response(HtmlTextWriter writer) メソッドで Html コンテンツの割り当てを生成する非常に大きなコントロール セットがあります。

HtmlHelper を使用して MVC でこれを使用しようとすると、次のようになります。

var ts = DateTime.Now;
using (var writer = new HtmlTextWriter(helper.ViewContext.Writer))
{
   writer.WriteLine("ToString(T) = " + ts.ToString("T") + "<br/>");
   writer.WriteLine("string.Format = " + string.Format("{0:T}", ts) + "<br/>");
   writer.WriteLine("WriteLine = {0:T}<br/>", ts);
}

ToString(T) = 9:27:07 AM
string.Format = 9:27:07 AM
WriteLine = 09:27:07 <=== This is in a 24 Hour Format

代わりに「helper.ViewContext.HttpContext.Response.Output」を使用すると、フォーマットは正しいですが、コンテンツはビューの他のすべての上に出力されます。

また、MVC aciont が、大きな HtmlString を生成する代わりに、VIEW ダイレクトを Response Stream に出力できるかどうかも疑問です。

簡単なテストデータ

これは MVC の問題ではなく、おそらく Razor の問題です。単純な cshtml ファイルでこれを再現できます。

@{
    var ts = DateTime.Now.AddHours(24 * 5 - 5);
}
ToString(T) = @ts.ToString("d") @ts.ToString("T") <br />
StringFormat = @string.Format("{0:d} {0:T}", ts) <br />
@using (var writer = new HtmlTextWriter(this.Output))
{
    writer.WriteLine("Output.WriteLine: {0:d} {0:T}<br/>", ts);
}
@using (var writer = new HtmlTextWriter(this.Response.Output))
{
    writer.WriteLine("Respone.Output.WriteLine: {0:d} {0:T}<br/>", ts);
}

RESULTS
Respone.Output.WriteLine: 1/4/2016 8:11:11 AM <== Correct but rendered at the top
ToString(T) = 1/4/2016 8:11:11 AM <== Correct
StringFormat = 1/4/2016 8:11:11 AM <== Correct
Output.WriteLine: 01/04/2016 08:11:11 <== Wrong format, this is 24HR
4

1 に答える 1

1

これは を使用した直接の結果ですHtmlTextWriter。ソースコードを見ると、InvariantCulture.

public HtmlTextWriter(TextWriter writer) : this(writer, "\t")
{
}

public HtmlTextWriter(TextWriter writer, string tabString) 
    // Hard coded to the invariant culture
    : base(CultureInfo.InvariantCulture)
{
    // More initialization...
}

私が知る限り、使用時に現在のスレッドの文化で文化をオーバーライドすることはできませんHtmlTextWriter

考えられる解決策の 1 つは、プレーンを使用することですTextWriter。これは、現在のスレッドのカルチャにデフォルト設定されます。

于 2015-12-30T19:49:36.960 に答える