ASP.NET Core 6 MVC中Kendo DatePicker日期无法映射控制器属性的咨询
解决方案:控制器中实现dd/MM/yyyy格式日期的有效映射
完全可以在控制器层面处理dd/MM/yyyy格式的日期映射,无需修改全局区域性设置,从而同时解决日期解析和数值控件的问题。以下是几种可行的实现方式:
1. 自定义模型绑定器(推荐)
创建一个针对DateTime类型的自定义模型绑定器,专门解析dd/MM/yyyy格式的日期字符串:
public class CustomDateTimeBinder : IModelBinder { public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); if (value == null) return null; string dateStr = value.AttemptedValue; if (DateTime.TryParseExact(dateStr, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime result)) { return result; } bindingContext.ModelState.AddModelError(bindingContext.ModelName, "日期格式无效,请使用dd/MM/yyyy格式"); return null; } }
应用方式:
- 全局注册(在
Global.asax或Startup.cs中):ModelBinders.Binders.Add(typeof(DateTime), new CustomDateTimeBinder()); ModelBinders.Binders.Add(typeof(DateTime?), new CustomDateTimeBinder()); // 支持可空日期 - 局部应用(直接标记在模型属性上):
public class YourModel { [ModelBinder(typeof(CustomDateTimeBinder))] public DateTime RequestedDate { get; set; } // 其他属性... }
2. 手动在控制器中解析日期
在接收表单的Action方法中,直接从Request中获取日期字符串并手动解析:
[HttpPost] public ActionResult SubmitForm(YourModel model) { string dateStr = Request.Form["RequestedDate"]; if (!string.IsNullOrEmpty(dateStr)) { if (DateTime.TryParseExact(dateStr, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime parsedDate)) { model.RequestedDate = parsedDate; } else { ModelState.AddModelError("RequestedDate", "日期格式错误,请输入dd/MM/yyyy格式的日期"); } } if (ModelState.IsValid) { // 业务逻辑处理 return RedirectToAction("Success"); } return View(model); }
3. 使用Action过滤器预处理日期
创建一个Action过滤器,在模型绑定前修改请求中的日期值:
public class ParseDateFilter : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { var request = filterContext.HttpContext.Request; var dateValue = request.Form["RequestedDate"]; if (!string.IsNullOrEmpty(dateValue) && DateTime.TryParseExact(dateValue, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime parsedDate)) { filterContext.ActionParameters["RequestedDate"] = parsedDate; } else if (!string.IsNullOrEmpty(dateValue)) { filterContext.ModelState.AddModelError("RequestedDate", "无效的日期格式"); } base.OnActionExecuting(filterContext); } }
应用方式:
[ParseDateFilter] [HttpPost] public ActionResult SubmitForm(YourModel model) { // 后续处理逻辑 }
关键说明
以上方法均无需修改全局区域性设置,因此NumericTextBoxFor仍会使用en-US的格式规则(以.作为小数分隔符),避免出现169.90被解析为16990的问题。同时确保客户端Kendo DatePicker的Format("dd/MM/yyyy")与服务器端解析格式保持一致。
内容的提问来源于stack exchange,提问作者sina_Islam
相关产品推荐
相关产品推荐

