2015-12-30 3 views
0

У меня есть очень большой набор элементов управления, который генерирует наделите содержание сайтов в методе отклика (HtmlTextWriter автор) с использованием HtmlTextWriter.WriteLine (формата, PARAMS объекта [арг])HtmlTextWriter обертки для HtmlHelper.ViewContext.Writer неправильного формата дата

Если я пытаюсь использовать это в MVC с HtmlHelper я получаю следующее

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» вместо того, чтобы затем форматирование правильно, но содержание outputed выше всего остального в представлении.

интересно Кроме того, если MVC aciont могу выводить VIEW directy в поток ответа вместо генерации большого HtmlStrings

SIMPLE TEST DATA

Это не проблема MVC, но, возможно, проблема Бритвы, я могу чтобы повторить это в простой 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 
+0

Не уверен, что я могу следить за тем, что вы здесь говорите. –

ответ

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.

Одним из возможных решений является использование простой TextWriter, которая по умолчанию соответствует культуре текущего потока.

+0

Так почему же «новый формат HtmlTextWriter (Response.Output)» правильно? – Steve

+0

Конструктор настраивает культуру сам по себе, но форматирование контролируется автором, который передается в «this.writer.WriteLIne (format, args)», Razor ViewContext.Writer - это StringWriter, который был установлен InvariantCulture. Не уверен, почему это не соответствует текущей культуре. Я переключусь на RenderPartial, так как я хочу, чтобы он переходил непосредственно к выходному потоку в любом случае – Steve

Смежные вопросы