3

ASP MVC 3 サイトでは、ユーザーが不完全なフォームに入力し、そのレコードをデータベースに保存し、後でフォームに戻ることができるようにしたいと考えています。間違って入力されたフィールドがあった場合、ユーザーが保存を押したときにそれらのエラー メッセージが表示されるようにします。

ただし、生年月日フィールドに固有の問題が発生しています。ユーザーが などの誤った日付を入力した14/01/2011場合、ユーザーが保存を押してモデル オブジェクトが POST でコントローラー アクションに戻ると、生年月日が空白になります。その後、条件に失敗if (ModelState.IsValid)し、データベースに保存されず、生年月日が空白でビューに戻されます。

ユーザーがこのフィールドに間違った日付を入力できるようにする方法はありますか? 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>
4

1 に答える 1

3

Queti Mportaが示唆したように、問題は、ポストバックすると、モデル バインダーが "14/01/2011" を a に解析しようとしてDateTime?失敗するため、代わりにデフォルト値を使用することです。null 許容型の場合、デフォルトは です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.");
于 2013-08-07T18:27:08.750 に答える