我有这个型号:
[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出现错误:
答案 0 :(得分:1)
我认为问题在于这一行:
@Html.TextBox("datepicker", null, new{id="datepicker"})
在这里,您将使用“datepicker”的名称和ID创建一个文本框。因此,当您提交表单时,MVC将尝试在Movie中找到名为“datepicker”的属性,这就是releaseDate
为空的原因。
我认为不需要编辑模板,你可以使用@ krillgar的推荐。
如果您仍想使用编辑器模板,则需要使用以下方法获取字段名称:
答案 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引用,然后是脚本块。