3

编辑 我有一个带有 itemtemplate 的 Asp.Net FormView:

 <asp:TemplateField HeaderText="DateStart" SortExpression="DateStart">
                    <EditItemTemplate>
                        <asp:TextBox ID="TextBoxEditStageDetailsDateStart" type="datetime-local" runat="server"
                            Text='<%# Bind("DateStart") %>' CssClass="TextBoxDateTime"></asp:TextBox>
                    </EditItemTemplate>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%# Bind("DateStart") %>'></asp:Label>
                    </ItemTemplate>
                    <ControlStyle Width="160px" />
                </asp:TemplateField>

当表单处于查看模式时,日期会正确显示(当然是在设置日期时):

在此处输入图像描述

但是,当表单在编辑模式下更改时, type="datetime-local" 的输入显示,需要用户选择一个的日期。这是弹出窗口显示:

在此处输入图像描述

但是,正如我在检查生成的 html 源代码时看到的那样,该已正确设置...

<input name="ctl00$MainContent$StageDetailsView$TextBoxEditStageDetailsDateStart" value="28/05/2013 10:00:00" id="MainContent_StageDetailsView_TextBoxEditStageDetailsDateStart" class="TextBoxDateTime" type="datetime-local" style="width:160px;">

所以有两个问题:首先是在编辑模式下,我看不到实际值是多少;第二,如果我只想更改日期或时间,我必须重新输入整个日期......

我的问题是:这是 Html5 计划的行为还是我遗漏了什么?

4

2 回答 2

6

根据W3 规范

= 本地日期和时间

表示本地日期和时间的字符串。以下部分,完全按照以下顺序

  • 一个约会。
  • 文字字符串“T”。
  • 一次。

例子:

1985-04-12T23:20:50.52

1996-12-19T16:39:57

所以,在你的情况下:

value="2013-05-28T10:00:00"

将工作。

[更新]

您可以使用以下aspx标记:

<asp:TemplateField HeaderText="DateStart" SortExpression="DateStart">
    <EditItemTemplate>
        <asp:TextBox ID="TextBoxEditStageDetailsDateStart" type="datetime-local" runat="server"
            Text='<%# GetFormattedDate(Eval("DateStart")) %>' CssClass="TextBoxDateTime"></asp:TextBox>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="Label1" runat="server" Text='<%# Bind("DateStart") %>'></asp:Label>
    </ItemTemplate>
    <ControlStyle Width="160px" />
</asp:TemplateField>

在后面的代码中,定义以下方法:

protected string GetFormattedDate(object dateTimeObject)
{
    DateTime dateTime;
    if (DateTime.TryParse(dateTimeObject.ToString(), out dateTime))
    {
        return String.Format("{0}-{1}-{2}T{3}:{4}:{5}",
            dateTime.Year,
            dateTime.Month.ToString().PadLeft(2, '0'),
            dateTime.Day.ToString().PadLeft(2, '0'),
            dateTime.Hour.ToString().PadLeft(2, '0'),
            dateTime.Minute.ToString().PadLeft(2, '0'),
            dateTime.Second.ToString().PadLeft(2, '0')
            );
    }
    return null;
}
于 2013-05-29T08:48:54.457 回答
2

好的,所以问题是 HTML 解析器需要一个按 ISO 8601 标准格式化的日期。

无需在后面的代码中使用自定义格式函数,我最终得到了这个声明性标记:

<asp:TextBox ID="TextBoxEditStageDetailsDateStart" type="datetime-local" runat="server"
Text='<%# Bind("DateStart", "{0:yyyy-MM-ddTHH:mm:ss}") %>' CssClass="TextBoxDateTime"></asp:TextBox>
于 2013-05-29T09:51:21.297 回答