You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 00:00:18