我有一个自定义数据注释验证器来验证出生日期是从今天起150年之间。
这是我的自定义数据注释:
public class DateOfBirthRange : RangeAttribute
{
public DateOfBirthRange()
: base(typeof(DateTime), DateTime.Now.AddYears(-150).ToShortDateString(), DateTime.Now.ToShortDateString()) { }
}
像这样使用它:
[Required(ErrorMessage = "BirthDate is required.")]
[DisplayName("Birth Date")]
[DateOfBirthRange(ErrorMessage = "BirthDate must be between {1:M/d/yyyy} and {2:M/d/yyyy}")]
public DateTime BirthDate { get; set; }
这是一个非常奇怪的问题,因为我回来的错误与数据注释无关。它导致我的观点出现错误:
<%: Html.DropDownListFor(m => m.JuniorSenior, (IEnumerable<SelectListItem>)ViewData["seniority"], new { @class = "input-small" })%>
ERROR: The ViewData item that has the key 'JuniorSenior' is of type 'System.String' but must be of type 'IEnumerable'.
这个错误很奇怪,因为代码的一部分工作得很好。 这也让人感到奇怪的是,只有在输入的日期是从今天开始的150年之后才会出现此错误。因此,只有在出生日期验证失败时才会出现错误。在我调试时,我注意到一旦删除自定义数据注释,一切正常并且没有遇到错误。
So that leads me to assume the problem is in my data annotation.
这是我的控制器代码,以防你想看看我正在尝试做什么。
[HttpPost]
public ActionResult Save(PatientModel patModel, FormCollection values)
{
// remove white space form text box fields
patModel.FirstName = values["FirstName"].Trim();
patModel.LastName = values["LastName"].Trim();
patModel.Initials = values["Initials"].Trim();
patModel.StreetAddress1 = values["StreetAddress1"].Trim();
patModel.StreetAddress2 = values["StreetAddress2"].Trim();
patModel.PostalCode = values["PostalCode"].Trim();
if (ModelState.IsValid)
{
try
{
// Pull the long form of the gender into the model.
if (!String.IsNullOrEmpty(values["genders"]))
{
patModel.Gender = values["genders"];
}
// Profile is valid, save it.
if (_Service.SaveProfile(Session["username"].ToString(), Session["password"].ToString(), patModel))
ViewData["SaveProfile"] = true;
else
ViewData["SaveProfile"] = false;
}
catch (Exception ex)
{
logger.Error("Function Name: Save Message: " + ex.Message + "");
}
}
IntializeSelectLists(patModel);
if (patModel.Title == "Select")
patModel.Title = "";
if (patModel.JuniorSenior == "Select")
patModel.JuniorSenior = "";
return View("Index", patModel);
}
我的IntializeSelectLists功能:
public void IntializeSelectLists(PatientModel pm)
{
seniority = new[] { "Select", "Jr.", "Sr." };
List<SelectListItem> JuniorSenior = new List<SelectListItem>();
foreach (string item in seniority)
{
SelectListItem alb = new SelectListItem { Text = item, Value = item };
JuniorSenior.Add(alb);
}
ViewData["seniority"] = JuniorSenior;
}
任何帮助将不胜感激。
答案 0 :(得分:0)
在我碰到头后,我终于找到了问题所在。
在我的IntializeSelectLists()
中,我在JuniorSenior
列表前填写了性别列表。事实证明,pm.Gender
返回null并因此导致异常。
它在m.JuniorSenior
崩溃的原因是因为我在m.Gender
之前显示了它。所以m.JuniorSenior
始终为null,因为代码没有达到填充m.JuniorSenior
的程度。
patModel.Gender = values["genders"].Trim();
我通过在Save()
添加此内容来解决问题。
感谢所有花时间帮助我的人:)