使用jquery datepicker,ModelState.IsValid = false

时间:2013-12-12 17:55:50

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 razor

我有这个型号:

[MetadataType(typeof(MovieMetadata))]
public partial class Movie
{

}

class MovieMetadata
{
    [ScaffoldColumn(false)]
    public int id { get; set; }

    [Required(ErrorMessage = "Title is required")]
    public string title { get; set; }

    [Required]
    public DateTime releaseDate { get; set; }

    public string storyline { get; set; }

    public Binary poster { get; set; }

    [ScaffoldColumn(false)]
    public DateTime? duration { get; set; }

    [ScaffoldColumn(false)]
    public Binary trailer { get; set; }
}

这是控制器代码:

    [HttpPost]
     public ActionResult Create([Bind(Exclude = "poster, trailer")]Movie movie, HttpPostedFileBase poster, HttpPostedFileBase trailer)
    {
        if (ModelState.IsValid)
        {
            //saving the movie
            OperationStatus opStatus = Repository.Save(movie);

            if (!opStatus.Status)
            {
                return View("Error");
            }
        }

        return View(movie);
    }

这是视图:

@model MoviesModel.Movie

@{
    ViewBag.Title = "Create";
    Layout = "~/Views/Shared/MoviesLayout.cshtml";
}

    @section createMovie{
    @using (Html.BeginForm(null, null, FormMethod.Post, new { id = "createForm", enctype = "multipart/form-data" }))
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)

        <div class="gallMemberBox">

            <div class="leftFormContent">
                <a href="#">Movie Name</a>

                <div class="imgTmpl">
                    <!--solo hay que especificar el src de la imagen-->
                    <img src="../../Content/img/imgTest.jpg" alt="" />  
                </div>
            </div>

            <div class="rightFormContent">

                <div>
                    @Html.LabelFor(model => model.title)

                    @Html.EditorFor(model => model.title)
                    @Html.ValidationMessageFor(model => model.title)
                </div>

                <div>
                    @Html.LabelFor(model => model.releaseDate)

                    @Html.EditorFor(model => model.releaseDate)
                    @Html.ValidationMessageFor(model => model.releaseDate)
                </div>

                <input type="submit" value="Create" />

            </div>

            <div class="clearBoth"></div>
        </div> 
    }
}

这是来自Views \ Shared \ EditorTemplates \ DateTime.cshtml

的模板
@Styles.Render("~/Content/themes/base/jquery-ui.css")

@Scripts.Render("~/Scripts/jquery-ui-1.8.24.js")

<script>
        $(function () {
            $("#datepicker").datepicker();
        });
</script>

@Html.TextBox("datepicker", null, new{id="datepicker"})

当我选择日期并提交表单时,ModelState为false,并且releaseDate出现错误:

enter image description here

4 个答案:

答案 0 :(得分:1)

我认为问题在于这一行:

@Html.TextBox("datepicker", null, new{id="datepicker"})

在这里,您将使用“datepicker”的名称和ID创建一个文本框。因此,当您提交表单时,MVC将尝试在Movie中找到名为“datepicker”的属性,这就是releaseDate为空的原因。

我认为不需要编辑模板,你可以使用@ krillgar的推荐。

如果您仍想使用编辑器模板,则需要使用以下方法获取字段名称:

How to get model's field name in custom editor template

答案 1 :(得分:1)

如果您想使用编辑器模板,请将其更改为以下内容:

@model DateTime?

@Styles.Render("~/Content/themes/base/jquery-ui.css")

@Scripts.Render("~/Scripts/jquery-ui-1.8.24.js")

@Html.TextBoxFor(m => m, new{@class="datepicker"})

<script>
        $(function () {
            $(".datepicker").datepicker();
        });
</script>

使用TextBoxFor将正确连接模型绑定。

此外,如果可能,我建议您将Styles.Render()Scripts.Render()移至_Layout。由于我将datepicker()更改为连接类,因此如果您愿意,也可以移动它。

答案 2 :(得分:0)

不是创建一个ID为datepicker的单独文本框,而是只为属性使用另一个EditorFor,并将一个HTML类添加到datepicker的对象中,然后使用它。

修改

这将是设置它的语法。 (在上面代码的“查看”部分中)

@Html.LabelFor(model => model.releaseDate, new { @class = "datepicker" })

然后您的javascript将更改为:

$(document).ready(function () {
    $('.datepicker').datepicker();
});

答案 3 :(得分:0)

要在您的视图中包含此内容,请尝试以下操作:

    @Html.TextBox("releaseDate", Model.releaseDate.ToString("MM/dd/yyyy"), new {id="datepicker" })

请记住稍后再包含您的JQuery引用,然后是脚本块。