BootStrap Datepicker从View返回null到Controller

时间:2014-11-03 09:27:52

标签: jquery asp.net-mvc-4 date datepicker

第一,我解释了我的问题,我们正在使用BootStrap DatePicker,在提交Html.BeginForm后,它进入带有选择日期的控制器并更新我的开发系统(pc)中的数据库但是相同的编码在测试服务器和客户系统。在测试服务器上调试后,我发现datepicker向控制器返回NULL 当我选择超过12天的日期时,例如(13-10-2014),并且少于12日期(如12-10-2014)工作正常。

changed the culture为Invariant,但仍然将其返回null值给控制器

在BeginForm中定义的datepicker,其他控件返回正确的值,期待DatePicker。

Html.BeginForm("MergeTeacherDetails","Profile", FormMethod.Post, new { id = "FormTeacherDetails" })))

DatePicker格式更改为('dd / mm / yyyy') 这里是查看代码

@Html.LabelFor(m => m.DOB, "DOB", new { @class = "control-label"})
<div class="controls">
 @{System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
   @Html.TextBoxFor(model => model.DOB, new { placeholder = "DOB",@readonly = "readonly",@class="ReadOnly" })}
</div>

这里是JavaScript

$('#DOB').datepicker({ startView: 2, autoclose: true, format: "dd/mm/yyyy", endDate: '@DateTime.Now.ToString("dd/MM/yyyy")', changeYear: true, changeMonth: true, weekStart: 1 });

这里是DAL代码

 public Nullable<System.DateTime> DOB { get; set; }

这里是控制器代码

public ActionResult MergeTeacherDetails(Staffs objStaffs)
    {

         int res = _staffRepository.InsertOrUpdate(objStaffs);
         if(res>0)
         {
          _mapStaffRepository.SaveMapStaff(objStaffs.StaffId);
         }
         return RedirectToAction("/MyProfile/1");
    }

在控制器中,参数objStaffs.DOB返回为NULL

这个

请帮我解决这个问题

提前致谢

1 个答案:

答案 0 :(得分:3)

您需要确保应用程序在使用模型绑定器将发布的值绑定到datetime值时使用预期的日期格式(将发布的值绑定到objStafss模型时)

默认情况下,模型绑定器将使用当前的区域性格式,在您的计算机上可能为dd/mm/yyyy,而测试/客户端计算机上的格式为mm/dd/yyyy

您可以创建模型绑定器,始终要求格式为dd/mm/yyyy的日期(在.net中表示为dd / MM / yyyy):

public class CustomModelBinder : DefaultModelBinder
{
    protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext,
        PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
    {
        var propertyType = propertyDescriptor.PropertyType;         
        if(propertyType == typeof(DateTime) || propertyType == typeof(DateTime?))
        {
            var providerValue = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            if (null != providerValue)
            {
                DateTime date;
                if (DateTime.TryParseExact(providerValue.AttemptedValue, "dd/MM/yyyy", CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
                {
                    return date; 
                }                    
            }
        }
        return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
    }
}

然后,您需要告诉MVC使用模型绑定器,例如,您可以通过替换默认绑定器,在global.asax Application_Start事件中为您的应用程序全局连接:

ModelBinders.Binders.DefaultBinder = new CustomModelBinder();