3

非常に興味深い問題に出くわしました。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 ヘルパーを使用する最初の行では、ある方法で日付形式が生成されるのに対し、2 番目の行では非常に異なる出力が生成されることに注意してください。理由はありますか?

注: 私は現在ブラジルにいるので、標準の短い日付形式は dd/MM/yyyy です。

4

1 に答える 1

9

これが発生する理由は、TextBox ヘルパーが内部に格納されている値を使用するViewData["datefilter"]ためです。その名前はdatefilter、日付をフォーマットするために渡される 2 番目の引数を完全に無視するためです。テキストボックスの名前を変更してみてください。

より良い解決策は、 の代わりにエディター テンプレートと厳密に型指定されたビューを使用することです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>
于 2010-06-18T05:27:12.090 に答える