将BootStrap Datepicker从View返回到Controller时返回null。
将BootStrap Datepicker从View返回到Controller时返回null。
首先,我解释一下我的问题。我们正在使用BootStrap DatePicker。在提交Html.BeginForm后,它会将选择的日期发送到控制器并更新开发系统(个人电脑)中的数据库,但是相同的代码在测试服务器和客户端系统上无法工作。在测试服务器上进行调试后,我发现DatePicker将NULL返回给控制器,当我选择日期超过12天时,例如(2014年10月13日),而选择少于12天的日期,例如(2014年10月12日),则工作正常。
我更改了文化设置为不变的,但它仍然将NULL值返回给控制器。
DatePicker定义在BeginForm内部,其他控件返回正确的值,只有DatePicker不起作用。
代码如下:
Html.BeginForm("MergeTeacherDetails","Profile", FormMethod.Post, new { id = "FormTeacherDetails" })))
DatePicker格式更改为('dd/mm/yyyy')
视图代码如下:
@Html.LabelFor(m => m.DOB, "DOB", new { @class = "control-label"})
@{System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;
@Html.TextBoxFor(model => model.DOB, new { placeholder = "DOB",@readonly = "readonly",@class="ReadOnly" })}
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
控制器代码如下:
public ActionResult MergeTeacherDetails(Staffs objStaffs)
{
int res = _staffRepository.InsertOrUpdate(objStaffs);
if(res>0)
{
_mapStaffRepository.SaveMapStaff(objStaffs.StaffId);
}
return RedirectToAction("/MyProfile/1");
}
在控制器的参数objStaffs.DOB中返回为NULL。
请帮助我解决这个问题,提前感谢您的帮助。
问题出现的原因是应用程序在使用模型绑定器(将发布的值绑定到objStafss
模型时)时,需要确保使用期望的日期格式。默认情况下,模型绑定器将使用当前的区域设置格式,而在测试/客户端机器上将使用mm/dd/yyyy
格式,而在您的机器上可能是dd/mm/yyyy
格式。
解决方法是创建一个自定义的模型绑定器,它始终期望以dd/mm/yyyy
格式的日期(在.NET中表示为dd/MM/yyyy)。然后告诉MVC使用您的模型绑定器。您可以在全局.asax的Application_Start
事件中将其用作应用程序的全局绑定器。
此外,您还需要确保在将现有值呈现到文本框时使用的格式是dd/mm/yyyy
。您可以使用DisplayFormatAttribute来实现这一点,但它只适用于EditorFor
而不适用于TextBoxFor
。您可以创建一个自定义辅助方法或自己的编辑模板来处理日期时间。
如果您使用的是MVC 5.1+,您可以添加DisplayFormat属性,并在代码中使用EditorFor来设置HTML属性,如placeholder或readonly。
以上就是关于"BootStrap Datepicker return null from View to Controller"问题的原因和解决方法的整理。