Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DateTime required in ModelState, however never set to be

I have a DateTime field in my form. For whatever reason, everytime I submit the form ModelState comes back as invalid and a message that my date time field (called PostDate) is required, even though in the view model I don't have the required attribute set.

Does anyone know why this would be happening as I'm going around in circles trying to figure it out.

Here is the view model

public class BlogViewModel
        {
            [Required]
            public string Title { get; set; }
            [Required]
            public string Content { get; set; }
            public bool Published { get; set; }
            public DateTime PostDate { get; set; }
        }

Here is the controller actions

            public ActionResult Create()
            {
                return View();
            } 

            //
            // POST: /Admin/Blog/Create

            [HttpPost]
            [ValidateInput(false)]
            public ActionResult Create(BlogViewModel model)
            {
                if(ModelState.IsValid)
                {
                    model.Content = HtmlSanitizer.SanitizeHtml(model.Content);
                    Services.BlogService.CreateBlogPost(model.Title, model.Content, User.Identity.Name);
                    return RedirectToAction("Index");
                }
                return View(model);
            }

Here is the View

    @using Payntbrush.Infrastructure.Mvc.Extensions
    @model Payntbrush.Presentation.Demo.MVC3.Areas.Admin.Models.BlogViewModel

    @Html.Resource(Html.ScriptTag("Areas/Admin/js/plugins/wysiwyg/jquery.wysiwyg.js"), ResourceType.Js)


    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

    @using (Html.BeginForm((string)ViewBag.Action, "Blog", FormMethod.Post, new { Id = "BlogEditor" }))
    {
        @Html.ValidationSummary(true)

            <div class="editor-label">
                @Html.LabelFor(model => model.Title)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Title)
                @Html.ValidationMessageFor(model => model.Title)
            </div>

            <div class="editor-label">
                @Html.LabelFor(model => model.Content)
            </div>
            <div class="editor-field">
                @Html.TextAreaFor(model => model.Content, new { @class = "wysiwyg blog-editor" })
                @Html.ValidationMessageFor(model => model.Content)
            </div>

            <div class="editor-label">
                Time of post (Only set this if you want to make a post appear to have been published at a different date.)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(model => model.PostDate, new{@class="datetimepicker"})
                @Html.ValidationMessageFor(model => model.PostDate)
            </div>

            <div class="editor-label">
                Published (Check to make this post live on the site)
            </div>
            <div class="editor-field">
                @Html.CheckBoxFor(model => model.Published)
                @Html.ValidationMessageFor(model => model.Published)
            </div>

            <p>
                <input class="large awesome" type="submit" value="Create" />
                @Html.ActionLink("Cancel", "Index", "Blog", null, new { @class = "large awesome cancel-button" })
            </p>
    }

    <div>

    </div>
like image 799
Chris Avatar asked Sep 19 '25 15:09

Chris


1 Answers

If you leave the corresponding field empty your model will be invalid because DateTime is a value type. You should use a nullable DateTime if you want to allow empty values:

public DateTime? PostDate { get; set; }
like image 118
Darin Dimitrov Avatar answered Sep 22 '25 08:09

Darin Dimitrov