Jquery 从视图到控制器的引导日期选择器返回null

Jquery 从视图到控制器的引导日期选择器返回null,jquery,asp.net-mvc-4,date,datepicker,Jquery,Asp.net Mvc 4,Date,Datepicker,首先,我解释我的问题,我们正在使用引导数据采集器,在提交Html.BeginForm后,它将与选择日期一起发送到控制器,并在我的开发系统(pc)中更新数据库,但相同的编码在测试服务器和客户机系统中不起作用。在测试服务器上调试之后,我发现datepicker返回NULL到控制器 如果我选择的日期超过12天,例如(2014年10月13日),而少于12天,例如(2014年10月12日),则工作正常 I作为不变量,但仍将其返回空值给控制器 在BeginForm中定义的datepicker,其他控件将返回

首先,我解释我的问题,我们正在使用引导数据采集器,在提交Html.BeginForm后,它将与选择日期一起发送到控制器,并在我的开发系统(pc)中更新数据库,但相同的编码在测试服务器和客户机系统中不起作用。在测试服务器上调试之后,我发现datepicker返回NULL到控制器 如果我选择的日期超过12天,例如(2014年10月13日),而少于12天,例如(2014年10月12日),则工作正常

I作为不变量,但仍将其返回空值给控制器

在BeginForm中定义的datepicker,其他控件将返回除datepicker之外的正确值

Html.BeginForm("MergeTeacherDetails","Profile", FormMethod.Post, new { id = "FormTeacherDetails" })))
日期选择器格式更改为('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>
这里是DAL代码

 public Nullable<System.DateTime> DOB { get; set; }
在控制器参数objStaffs.DOB中,返回为NULL

这个

请帮我解决这个问题


提前感谢

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

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

您可以创建模型活页夹,该活页夹始终希望日期的格式为
dd/mm/yyyy
(在.net中表示为dd/mm/yyyy):

然后您需要告诉MVC使用您的模型绑定器,例如,您可以在global.asax
application\u Start
事件中为您的应用程序全局连接它,方法是替换默认绑定器:

ModelBinders.Binders.DefaultBinder = new CustomModelBinder();

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

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

您可以创建模型活页夹,该活页夹始终希望日期的格式为
dd/mm/yyyy
(在.net中表示为dd/mm/yyyy):

然后您需要告诉MVC使用您的模型绑定器,例如,您可以在global.asax
application\u Start
事件中为您的应用程序全局连接它,方法是替换默认绑定器:

ModelBinders.Binders.DefaultBinder = new CustomModelBinder();

此编码中的问题是没有ViewModel。如果我想创建ViewModel,在整个项目中处理它非常复杂。你能发布控制器代码吗?你能帮我解决这个问题吗?这个编码中的问题没有ViewModel。如果我想创建ViewModel,在整个项目中处理它非常复杂。你能发布控制器代码吗?你能帮我解决这个问题吗?谢谢你的回复,这个代码工作正常,但当我选择日期(2014年10月30日)时,它会将该日期转换为(2014年1月30日)。您是否已在本地选中此方案?您还需要确保将现有值呈现到文本框时使用的格式为
dd/mm/yyyy
。您可以在
[DisplayFormat(DataFormatString=“{0:dd/MM/yyyy}”,ApplyFormatInEditMode=true)]
中使用DisplayFormatAttribute,但这仅适用于
编辑器for
,而不适用于
文本框for
。如果使用MVC 5.1+,您可以为DateTimes创建自定义帮助程序或自己的编辑器模板,您可以添加DisplayFormat属性并将代码更改为使用EditorFor,同时仍然使用
@html.EditorFor(model=>model.Dob,new{htmlAttributes=new)设置html属性,如占位符或只读{placeholder=“DOB”、@readonly=“readonly”、@class=“readonly”}})
感谢您的回复,此代码运行良好,但当我选择日期(2014年10月30日)时,它会将该日期转换为(2014年1月30日)。您是否已在本地选中此方案?您还需要确保将现有值呈现到文本框时使用的格式为
dd/mm/yyyy
。您可以使用DisplayFormat属性,如
[DisplayFormat(DataFormatString=“{0:dd/mm/yyyy}”,ApplyFormatInEditMode=true]
但这仅适用于
EditorFor
而不适用于
TextBoxFor
。您可以为datetimes创建自定义帮助程序或自己的编辑器模板。如果您使用的是MVC 5.1+,则可以添加DisplayFormat属性并将代码更改为使用EditorFor,同时仍可以设置诸如placeholder或readonly之类的html属性使用
@Html.EditorFor(model=>model.Dob,new{htmlAttributes=new{placeholder=“Dob”、@readonly=“readonly”、@class=“readonly”})
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);
    }
}
ModelBinders.Binders.DefaultBinder = new CustomModelBinder();