如何通过DateRangeViewModel自身更新表单提交的属性值?
解决DateRangeViewModel自更新时的StackOverflowException问题
需求是让DateRangeViewModel自身处理表单提交的日期值,无需控制器介入。比如用户提交2022-01-01 12:00:00 AM,希望To字段自动更新为2022-01-02 12:00:00 AM,但原代码抛出System.StackOverflowException异常:
public class DateRangeViewModel { public DateTime? From { get; set; } public DateTime? To { get { if (!To.HasValue) { return null; } return To.Value.AddDays(1); } set {} } }
异常原因
在To属性的get访问器中,直接访问To.HasValue和To.Value会再次触发To的get访问器调用,形成无限递归,最终导致栈溢出。
解决方案
使用私有字段存储原始提交值,在get访问器中基于私有字段处理逻辑,避免递归调用:
public class DateRangeViewModel { public DateTime? From { get; set; } // 私有字段存储表单提交的原始To值 private DateTime? _to; public DateTime? To { get { if (!_to.HasValue) { return null; } // 基于原始值返回加1天后的结果 return _to.Value.AddDays(1); } set { // 接收表单提交的值并存储到私有字段 _to = value; } } }
这样处理后,表单提交的值会存入私有字段_to;获取To属性值时,直接返回_to加1天后的结果,完全在ViewModel内部完成值的更新,无需控制器介入。
内容的提问来源于stack exchange,提问作者sptramp
相关产品推荐
相关产品推荐

