【问题标题】:ModelState.IsValid = false using jquery datepickerModelState.IsValid = false 使用 jquery datepicker
【发布时间】:2013-12-12 17:55:50
【问题描述】:

我有这个模型:

[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报错:

【问题讨论】:

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


    【解决方案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() 来连接一个类,如果你愿意,你也可以移动它。

    【讨论】:

    • 我尝试了这个并且在渲染视图时遇到了这个异常传递到字典中的模型项是空的,但是这个字典需要一个“System.DateTime”类型的非空模型项。视图有这一行 @Html.EditorFor(model => model.releaseDate) 我把上面的代码放在我的 EditorTemplates 文件夹中
    • @model DateTime 更改为@model DateTime?。我也会更新原始答案。
    • 你能更好地解释一下为什么 mvc 需要将 null 放入传递到字典中的模型项,它将在视图上呈现吗?
    • 因为来自您的模型的属性 (releaseDate) 可以为空,并且您不能直接将可空的 DateTime 分配给不可空的 DateTime
    【解决方案2】:

    我认为问题出在这一行:

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

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

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

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

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

    【讨论】:

    • 我放了这行,这不起作用:@Html.TextBox("releaseDate", null, new{id="datepicker"})
    • 您可以在浏览器中使用开发者工具并在网络下查看提交表单时发送到服务器的内容吗?
    【解决方案3】:

    不用创建一个 ID 为 datepicker 的单独文本框,只需使用另一个 EditorFor 作为属性,然后向 datepicker 对象添加一个 HTML 类,然后使用它。

    编辑

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

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

    然后你的 javascript 会变成:

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

    【讨论】:

      【解决方案4】:

      要将其包含在您的视图中,请尝试以下操作:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-20
        • 2013-09-08
        • 2010-12-19
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        • 1970-01-01
        • 2019-09-11
        相关资源
        最近更新 更多