Почему формат даты в ASP NET MVC отличается при использовании внутри Html Helper? - PullRequest
3 голосов
/ 18 июня 2010

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

<%= 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, создает формат даты одним способом, а вторая - совсем другим выводом.,Есть идеи, почему?

Примечание. В настоящее время я нахожусь в Бразилии, поэтому стандартный формат коротких дат здесь: дд / мм / гггг.

1 Ответ

9 голосов
/ 18 июня 2010

Причина, по которой это происходит, заключается в том, что помощник 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>
...