在我们的ASP MVC 3站点中,我们希望用户能够输入不完整的表单,将该记录保存到数据库,然后再返回到表单。如果输入的字段不正确,我们希望在用户点击保存时显示这些错误消息。
然而,出生日期的问题正在发生。如果用户输入的日期不正确,例如14/01/2011
,当用户点击保存并且模型对象POST回到控制器操作时,出生日期将作为空白。然后它失败了if (ModelState.IsValid)
条件,没有保存到数据库,并被发送回具有空白出生日期的视图。
是否有办法允许用户在此字段中输入错误的日期,保留该值并POST回到具有该值的视图以及通常由模型生成的错误消息?由于我们使用的是jQuery输入掩码,因此输入的值将始终为数字且为MM / DD / YYYY格式。
模型
[DisplayName("Date of Birth")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? Birthdate { get; set; }
控制器
[HttpPost]
public ActionResult Edit(Monet.Models.AgentTransmission agenttransmission)
{
//Date of birth field is null right here in 'agenttransmission' object if
//user enters incorrect value/date
//redirect if security is not met.
if (!Security.IsModifier(User)) return RedirectToAction("Message", "Home", new { id = 1 });
//Tax Id security
ViewBag.FullSSN = Security.IsFullSsn(User);
try
{
agenttransmission = AgentTransmissionValidator.ReformatFields(agenttransmission);
ViewBag.ErrorMessage = AgentTransmissionValidator.ValidateAgent(agenttransmission);
if (ModelState.IsValid)
{
//Whole bunch of code to determine if input is complete/incomplete
//Save the record
db.Entry(agenttransmission).State = EntityState.Modified;
db.SaveChanges();
} //end if model state valid
}
catch (DbEntityValidationException dbEx)
{
ViewBag.ErrorMessage = "An error has occurred, we apologize for the incovenience. IT has been notified and will resolve the issue shortly.";
SendEmail.ErrorMail(Common.ErrorCheck.CombineDbErrors(dbEx));
}
catch (Exception ex)
{
ViewBag.ErrorMessage = ErrorCheck.FriendlyError(ex);
SendEmail.ErrorMail(ex);
}
return View(agenttransmission);
}
查看
<div class="M-editor-label">
@Html.LabelFor(model => model.Birthdate)<span class="req">*</span>
</div>
<div class="M-editor-field">
@Html.EditorFor(model => model.Birthdate)
@Html.ValidationMessageFor(model => model.Birthdate)
</div>
答案 0 :(得分:2)
正如Queti Mporta建议的那样,问题在于,当您回发时,模型绑定器会尝试将“14/01/2011”解析为DateTime?
并失败,因此它使用默认值代替。对于可空类型,默认值为null
,这就是您获得空白的原因。
如果您要将模型更改为...
[DisplayName("Date of Birth")]
[DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
public string Birthdate { get; set; } // note: string instead of DateTime?
...用户现在可以输入格式为MM / dd / yyyy的任何内容,但是当它被回发时,它只会存储在一个字符串中。
您现在需要添加逻辑(在您的控制器中或可从控制器访问的某个位置)以尝试自行解析:
DateTime birthdate;
var isDateValid = DateTime.TryParse(agenttransmission.Birthdate, out birthday);
if (!isDateValid ) ModelState.AddModelError("Birthdate", "Birthday needs to be a valid date.");