0

生年月日が今日から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;
        }

どんな助けでもいただければ幸いです。

4

1 に答える 1

0

頭をぶつけた後、私は最終的に問題が何であるかを見つけました。

私の場合、リストIntializeSelectLists()の直前に性別リストを入力していましたJuniorSenior。結局のところ、pm.Genderはnullを返していたため、例外が発生していました。

クラッシュしたのm.JuniorSeniorは、前に表示していたからm.Genderです。したがってm.JuniorSenior、コードがに入力されたポイントに到達しなかったため、常にnullでしたm.JuniorSenior

patModel.Gender = values["genders"].Trim();

これを自分のに追加することで問題を解決しましたSave()

私を助けるために時間を割いてくれたみんなに感謝します:)

于 2012-05-24T13:47:37.090 に答える