.NET Framework 4.8 Razor页面提交时无法同时获取StartDate与EndDate值
问题原因
StartDate输入框加了disabled="disabled"属性,HTML表单提交时,disabled状态的元素不会被包含在提交的数据中,所以控制器接收不到StartDate的原值,只能用DateTime类型的默认值01/01/0001。
解决方案
方案1:替换disabled为readonly
把StartDate输入框的disabled属性改成readonly,readonly状态的元素不可编辑,但会被表单提交,刚好符合需求:
<input aria-label="date" type="text" id="StartDate" data-bind="value: StartDate" name="StartDate" placeholder="dd/mm/yyyy" readonly="readonly" size="10" maxlength="10" style="margin-left:0px;" />
方案2:保留disabled,新增隐藏字段
如果必须保留disabled状态(比如样式需求),可以在StartDate输入框后面加一个同名的隐藏字段,绑定同一个Knockout observable,提交时隐藏字段会把值传给控制器:
<input aria-label="date" type="text" id="StartDate" data-bind="value: StartDate" name="StartDate" placeholder="dd/mm/yyyy" disabled="disabled" size="10" maxlength="10" style="margin-left:0px;" /> <!-- 新增隐藏字段 --> <input type="hidden" name="StartDate" data-bind="value: StartDate" />
实现EndDate依赖StartDate的逻辑
用Knockout的subscribe方法监听StartDate的变化,自动处理EndDate的取值逻辑,比如限制EndDate不能早于StartDate,或者默认和StartDate一致:
startDateOb.subscribe(function(newStartValue) { // 先判断新的StartDate是否有效 if (newStartValue) { const startDate = new Date(newStartValue); const endDate = endDateOb() ? new Date(endDateOb()) : null; // 如果EndDate为空或者早于StartDate,自动设置为StartDate if (!endDate || endDate < startDate) { endDateOb(newStartValue); } } });
额外注意事项
- 确保模型上的日期属性配置了正确的格式解析,避免提交时日期格式不匹配:
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime StartDate { get; set; } [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)] public DateTime EndDate { get; set; }
- 检查jQuery验证规则,确保新增的EndDate验证逻辑不会影响StartDate的提交值。
内容的提问来源于stack exchange,提问作者Iria
相关产品推荐
相关产品推荐

