Asp.NET MVC中Session["DateOfBirth"]如何仅输出日期不显示时间
解决方案
你遇到的问题核心是DateTime类型默认ToString()会输出日期+时间,且直接读取Session渲染时没有用到视图模型配置的格式化规则,以下是三种可行的修改方案,可根据你的项目情况选择:
方案1:直接在视图中格式化(最快实现)
直接对Session存储的DateTime对象做日期格式化,同时增加空值判断避免空引用报错,修改Index视图代码即可:
<div class="col"> <h6>Date of Birth</h6> <p class=" ">@(Session["dob"] != null ? Convert.ToDateTime(Session["dob"]).ToString("yyyy-MM-dd") : "")</p> </div>
如果要适配系统时区的短日期格式,也可以把ToString("yyyy-MM-dd")替换为ToShortDateString()。
方案2:控制器存入Session时就做格式化
在控制器赋值Session的时候直接转成日期格式的字符串存入,视图不需要做任何修改:
Session["dob"] = umail.u_dob.ToString("yyyy-MM-dd");
如果要处理u_dob可能为空的情况,可以加判空逻辑:
Session["dob"] = umail.u_dob.HasValue ? umail.u_dob.Value.ToString("yyyy-MM-dd") : "";
方案3:使用视图模型的格式化规则(最符合MVC规范)
你现在的代码没有用到定义好的视图模型的特性,调整逻辑如下:
- 首先修改视图模型的dob属性,增加格式化注解,如果你的u_dob是DateTime类型,建议把属性类型从string改为DateTime:
[Display(Name = "Date of Birth")] [Required(ErrorMessage = "Date of Birth required")] [DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public DateTime dob { get; set; } // 如果坚持用string类型可以改为: // [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")] // public string dob { get; set; }
- 控制器中不要直接读Session渲染视图,而是把值赋值给视图模型实例,再把模型传给视图:
var model = new 你的视图模型类名(); model.dob = umail.u_dob; // 如果需要存Session还是可以保留 Session["dob"] = umail.u_dob; return View(model);
- 视图中绑定模型的dob属性,而不是直接读Session:
<div class="col"> <h6>@Html.DisplayNameFor(m => m.dob)</h6> <p class=" ">@Html.DisplayFor(m => m.dob)</p> </div>
这个方案的好处是所有格式化规则都统一在视图模型中维护,后续修改格式只需要改注解即可,符合MVC的分层规范。
内容的提问来源于stack exchange,提问作者Arahimx
相关产品推荐
相关产品推荐

