昨天在做一個功能,要在界面上按照規定的格式顯示一個時間,如果直接在expression那裡格式化的話(如下:) 以上情形,執行期間會報拒絕訪問的問題,當然這並非難事,解決方案有好幾種(本人前端時間控制項用的是My97Datepicker): (ps.這裡忽略那種非綁定Model的情形,因為不綁定Mod
昨天在做一個功能,要在界面上按照規定的格式顯示一個時間,如果直接在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 = "貨船起運時間" })
此文章到此截止