• .net 视图格式化


      昨天在做一个功能,要在界面上按照规定的格式显示一个时间,如果直接在expression那里格式化的话(如下:)

      

    @Html.DisplayFor(c => Convert.ToDateTime(c.IssueDate).ToString("yyyy-MM-dd HH:mm:ss"), new
            {
                @class = "form-control",
                onFocus = "WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',alwaysUseStartDate:true})",
                @placeholder = "签发日期"
            })

      以上情形,执行期间会报拒绝访问的问题,当然这并非难事,解决方案有好几种(本人前端时间控件用的是My97Datepicker):

      (ps.这里忽略那种非绑定Model的情形,因为不绑定Model那种情况,就只是显示一个时间的话,就可以直接用ToString(string format)就可以格式化时间格式了;同时也可以使用format的简写,format简写可以参考:http://www.cnblogs.com/shaocm/archive/2012/08/15/2639998.html

      第一种,最简单的是直接在后台把该字段在后台使用ToString(string format)格式化好规定的格式,再绑定在前台,因为个人在这里是使用AutoMap直接把数据库的值映射到该Model上的,故此方法看起来有些别扭,故不用此方法。

      第二种,如果你只是需要在界面上显示,并非可编辑的情况的话,比如:

        

            @Html.DisplayFor(c => c.IssueDate, new
            {
                @class = "form-control",
                onFocus = "WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',alwaysUseStartDate:true})",
                @placeholder = "签发日期"
            })

        这时候,你直接可以在Model的属性上面加上如下注解:

            /// <summary>
            /// IssueDate
            /// </summary>         
            [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd HH:mm:ss}")]
            public DateTime? IssueDate { get; set; }

      这样就可以通过注解直接控制该属性的日期显示格式了,这里要注意,如果视图界面上使用的并非是@Html.DisplayFor,而是使用@Html.TextBoxFor或者是@Html.EditorFor的话,该注解格式化则不起作用。

      第三种,如果界面上使用的是@Html.EditorFor的话,这时也可以通过加上另外一个注解来控制界面显示格式,如下:

        

            /// <summary>
            /// IssueDate
            /// </summary>         
            [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd HH:mm:ss}")]
            public DateTime? IssueDate { get; set; }

      然后界面上使用:

    @Html.EdittorFor(c => c.IssueDate, new
            {
                @class = "form-control",
                onFocus = "WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',alwaysUseStartDate:true})",
                @placeholder = "签发日期"
            })

      这样也可以通过该注解来控制日期显示格式。

      第四种,如果界面上要求使用@Html.TextboxFor来显示的话,如下:

        

        @Html.TextBoxFor(m => m.RemittanceDate, new { @class = "form-control validate[required]", onFocus = "WdatePicker({startDate:'%y-%M-01',dateFmt:'yyyy-MM-dd',alwaysUseStartDate:true})", @placeholder = "请输入汇款日期" })

    ,则以上两个注解的格式控制都不起作用,这时候,也有三种解决方法,如下:

        ①使用@Html.TextBoxFor的重载函数,其中一个是有string format参数的(推荐此方式),如下:

          

      @Html.TextBoxFor(m => m.RemittanceDate, "{0:yyyy-MM-dd}", new { @class = "form-control validate[required]", onFocus = "WdatePicker({startDate:'%y-%M-01',dateFmt:'yyyy-MM-dd',alwaysUseStartDate:true})", @placeholder = "请输入汇款日期" })

        ②使用如下方法也可以(推荐此方式):

        

    @Html.TextBoxFor(m => m.RemittanceDate, new { @class = "form-control validate[required]", Value = String.Format("{0:yyyy-MM-dd}", Model.RemittanceDate), onFocus = "WdatePicker({startDate:'%y-%M-01',dateFmt:'yyyy-MM-dd
    ',alwaysUseStartDate:true})", @placeholder = "请输入汇款日期" })

        ③以下也是类似方式:

        

              @Html.TextBoxFor(c => c.IssueDate, new
            {
                @class = "form-control",
                Value = Convert.ToDateTime(Model.ShipBeginTime).ToString("yyyy-MM-dd HH:mm:ss"),
                onFocus = "WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',alwaysUseStartDate:true})",
                @placeholder = "签发日期"
            })

        以上第③中方法,要注意,一定要加上Convert.ToDateTime()转换成时间类型,否则后面的ToString(string format)函数会报说不存在带有一个参数的重载,这是因为ToString()函数是积累Object的通用函数,DateTime类型重载了该方法,

    DateTime类型的ToString()方法可以带一个参数也可以不带,所以要强制转换成DateTime类型才能使用ToString(string format)函数格式化。

      以上是使用MS 的Mvc,如果是传统的WebForm的话,使用<%#Eval("PA_STATUS")%>这种方式绑定值的话,Eval()也是有重载函数带有格式化参数可以控制显示格式的,不过WebForm我记得有时候要使用Eval,有时候要使用DataBind()

    函数的,具体忘了,有知道的希望可以在评论那里告知,谢谢!

      ps.以上几种方式,建议使用楼主推荐的那两种,因为其他那几种方式,如果Model里面的该字段是空的话,推荐的那两种方式初始化界面是空的,但是另外那几种方式则不显示空,一般是显示:0001-01-01 00:00:00之类的非标准时间的显示,以上推荐的那两种方法就不会出现如此问题。针对另外那几种方法出现的时间初始显示时间的问题,一下为解决方案:

      例如:如下,如果ShipBeginTime为null的话,则界面初始时间则显示为0001-00-00 00:00:00之类的非法时间:

        

    @Html.TextBoxFor(c => c.IssueDate, new
            {
                @class = "form-control",
                Value = Convert.ToDateTime(Model.ShipBeginTime).ToString("yyyy-MM-dd HH:mm:ss"),
                onFocus = "WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',alwaysUseStartDate:true})",
                @placeholder = "签发日期"
            })

    ,此时如果要默认显示为空的话,则要手动调整一下,修改如下便可:

        

            @Html.TextBoxFor(c => c.ShipBeginTime, new
            {
                @class = "form-control validate[required]",
                Value = Model.ShipBeginTime == null ? "" : Convert.ToDateTime(Model.ShipBeginTime).ToString("yyyy-MM-dd HH:mm:ss"),
                onFocus = "WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss',alwaysUseStartDate:true})",
                @placeholder = "货船起运时间"
            })

       另外,如果是格式化数字的话,也类推过去就可以了,可以搜索下String.Format()函数是如何格式化的,例如,要保留两位小数,如下:

      

    Html.TextBoxFor(m => m.ChargeMoney, new { Value = String.Format("{0:F2}", Model.ChargeMoney),  @class = "form-control validate[required]", @readonly = "readonly" })
    

      其他情况如此类推,读者自己脑补了~不懂的可以留言。

    此文章到此截止

      
  • 相关阅读:
    dom4j
    javase的一些基础(4)
    javase的一些基础(3)
    javase的一些基础(2)
    javase的一些基础(1)
    不要在乎形式
    世界观--我对这个世界的理解
    feign.FeignException: status 400 reading xxx 异常
    org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean
    SpringBoot整合Junit测试时要注意@SpringBootTest注解需指明启动类
  • 原文地址:https://www.cnblogs.com/ismallboy/p/5291485.html
Copyright © 2020-2023  润新知