2010-06-18 2 views
3

Я только что наткнулся на очень интересную проблему. Если я использую ViewData для передачи значения DateTime в представление и затем отображаю его внутри текстового поля, даже если я использую String.Format точно так же, я получаю разные результаты форматирования при использовании помощника Html.TextBox.Почему формат даты в ASP NET MVC отличается при использовании внутри Html Helper?

<%= Html.TextBox("datefilter", String.Format("{0:d}", ViewData["datefilter"]))%> 
<input id="test" name="test" type="text" value="<%: String.Format("{0:d}", ViewData["datefilter"]) %>" /> 

Приведенный выше код предоставляет следующий HTML:

<input id="datefilter" name="datefilter" type="text" value="2010-06-18" /> 
<input id="test" name="test" type="text" value="18/06/2010" /> 

Обратите внимание, как кулак линия, которая использует помощник Html производит формат даты в одну сторону, а второй один производит совсем другой вывод. Любые идеи почему?

Примечание: Я сейчас в Бразилии, поэтому стандартный формат коротких дат здесь - dd/MM/yyyy.

ответ

9

Причина этого в том, что хелпер TextBox использует значение, хранящееся внутри ViewData["datefilter"], потому что его имя равно datefilter и полностью игнорирует второй аргумент, который вы передаете, который должен отформатировать дату. Попробуйте изменить имя текстового поля.

Лучшим решением является использование шаблонов редактора и строго типизированных представлений вместо ViewData. Вот пример.

Модель:

public class MyModel 
{ 
    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", 
        ApplyFormatInEditMode = true)] 
    public DateTime Date { get; set; } 
} 

Контроллер:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyModel 
     { 
      Date = DateTime.Now 
     }; 
     return View(model); 
    } 
} 

Вид:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<SomeNs.Models.MyModel>" %> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
    <%: Html.EditorFor(x => x.Date) %> 
</asp:Content> 
+0

+1 Взгляните на последних трех пунктах, он уточняет ответ Дарин немного больше. http://weblogs.asp.net/jeff/archive/2009/08/18/under-the-covers-of-html-helpers-in-asp-net-mvc.aspx. Дата должна по-прежнему оцениваться с использованием текущей культуры, но ее нет. Зачем? – Ahmad

+0

Теперь я вижу, что я сделал. Не только ViewData имел ключ с именем «datefilter», но также и имя параметра для маршрута. Таким образом, даже после полного удаления ViewData, Html.TextBox («datefilter») вытащил его из ModelState или где-то еще. Я просто не знаю, почему не отформатирован в соответствии с нынешней культурой, как сказал Ахмад. Но я думаю, теперь я понял немного лучше, как эти помощники должны быть использованы, благодаря вам, ребята. А также, спасибо за этот отличный пример Daring, это может показаться тривиальным, но на самом деле это намного приятнее, чем использование ViewData. ;) –