【问题标题】:Milliseconds are being truncated by an ASP.NET MVC Hidden Input element毫秒被 ASP.NET MVC 隐藏输入元素截断
【发布时间】:2012-05-16 11:42:59
【问题描述】:

我有一个呈现项目列表的视图,每个项目都包含一个Date 属性。

<%:Html.HiddenFor(m => m.Items[j].Date)%>

许多其他属性被隐藏或显示,用户可以针对任何项目输入 cmets 并将这些 cmets 保存到数据库中。这是一个“批量编辑”类型的视图。

我之前使用过这些视图效果很好,但是我遇到了 Date 属性的问题,因为它是这样渲染的

<input name="Items[3].Date" type="hidden" value="3/05/2012 11:56:48 AM" />

问题是我需要使用 DateTime 作为此数据项的主键的一部分。我可以截断数据库中的毫秒数以允许匹配,但不能保证每秒只有一个数据点。

如何确保 DateTime 的隐藏输入字段保留所有属性信息,包括毫秒组件?

【问题讨论】:

    标签: asp.net .net asp.net-mvc datetime


    【解决方案1】:

    那么你真的需要使用

    <%:Html.HiddenFor(m => m.Items[j].Date)%>
    

    为什么不保持简单

    <input type="hidden" name="Items[<%:j%>].Date" value="<%:model.Items[j].Date.ToString("dd/MM/yy/ HH:mm:ss.fffff")%>"/>
    

    【讨论】:

    • 显然您对简单的定义与我的不同。这比原来要记住的要多得多。因为现在每个包含隐藏日期的视图都需要更新为更大的文本行。
    • 我尽量不依赖隐藏的东西,它们有自己的历史。您必须学习哪些才能了解他们的租约
    【解决方案2】:

    在HiddenFor 字段中强制使用日期时间的格式没有任何成功。

    DisplayFormat 属性可以强制DisplayFor 字段的格式,但对HiddenFor 字段没有影响。

    我采用了下面的 no-quite-a-hack 来使其工作 - 序列化和反序列化 ticks 属性以确保保留真实时间。

    public long DateTicks 
    { 
        get
        {
            return this.Date.HasValue ? this.Date.Value.Ticks : 0; 
        } 
        set 
        { 
            if (value == 0) 
                this.Date = null; 
            else 
                this.Date = new DateTime(value); 
        }
    }
    

    【讨论】:

      【解决方案3】:

      使用

      <%:Html.HiddenFor(m => m.Items[j].Date.Ticks)%>
      

      【讨论】:

        【解决方案4】:

        在模型中的 Date 属性上使用 DisplayFormat 属性,并在格式字符串中拼出毫秒:

        [DisplayFormat(DataFormatString = "{0:yyyyMMddhhmmssfff}")]
        

        【讨论】:

        • 嘿,我只是想指出这一点-击败我。类似问题:stackoverflow.com/questions/9724713/…
        • 这对我不起作用。根据链接的问题,此属性适用于显示字段,但不适用于隐藏字段。
        猜你喜欢
        • 2014-10-16
        • 2010-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多