当我第一次加载页面时,我的日期文本框都未通过验证。 这似乎是因为两个Date属性是根据需要设置的,但都是null。
我的目标是:
1)让模型传递到包含要搜索的标准的控制器中
2)当页面返回结果时,该标准将被重新加载
3)当第一页加载时,它会将日期设置为默认值DateTime.Now
而不显示任何结果。当您提交条件时,它将在下一页加载时显示结果。
// Model
public class SearchModel
{
public long? StudentId { get; set; }
[Required]
public DateTime? Date1 { get; set; }
[Required]
public DateTime? Date2 { get; set; }
public List<string> Students { get; set; }
}
// View
@model SearchModel
<div>
@using (Html.BeginForm("StudentSearch", "Student", FormMethod.Post))
{
<span>
Date 1 @Html.TextBoxFor(m => m.Date1)
Date 2 @Html.TextBoxFor(m => m.Date2)
<input type="submit" value="Search" />
</span>
}
</div>
<div>
@foreach(var s in model.Students)
{ <span>@s</span> }
</div>
// Controller
[HttpGet]
public ActionResult StudentSearch(SearchModel model)
{
if (model.Date1 == null || model.Date2 == null)
{
model.Date1 = DateTime.Now;
model.Date2 = DateTime.Now;
}
return View();
}
答案 0 :(得分:2)
日期时间输入非常敏感。用户可能会输入拼写错误, ModelBinder 将无法将其绑定到参数。因此,我建议您使用jQuery UI Datepicker或Kendo Datepicker等框架。
public class StudentController : Controller
{
[HttpGet]
public ActionResult StudentSearch(SearchModel model)
{
if (model.Date1 == null || model.Date2 == null)
{
model.Date1 = DateTime.Now;
model.Date2 = DateTime.Now;
}
return View(model); <=====
}
[HttpPost]
public ActionResult StudentSearchPost(SearchModel model)
{
if (ModelState.IsValid)
{
// Do something
}
return View();
}
}
查看
@model DemoWebMvc.Models.SearchModel
<div>
@using (Html.BeginForm("StudentSearchPost", "Student", FormMethod.Post))
{
<span>
Date 1 @Html.TextBoxFor(m => m.Date1)
Date 2 @Html.TextBoxFor(m => m.Date2)
<input type="submit" value="Search"/>
</span>
}
</div>
来自评论: 我正在使用日期时间选择器控件。自模型 默认为NULL,因为它是DateTime? 第一页加载显示 我的日期时间字段未通过验证。 他们没有失败,因为 用户选择的内容无效
问题是您将无效模型传递给页面加载时的查看,默认模型绑定器尝试绑定到模型实例,并在页面加载时触发验证错误。
如果您没有有效型号,则不应将其发送到页面加载时查看以避免显示验证错误。
public class StudentController : Controller
{
[HttpGet]
public ActionResult StudentSearch()
{
return View();
}
[HttpPost]
public ActionResult StudentSearch(SearchModel model)
{
if (ModelState.IsValid)
{
}
return View(model);
}
}
@model DemoWebMvc.Models.SearchModel
@{
Layout = null;
}
@using (Html.BeginForm("StudentSearch", "Student", FormMethod.Post))
{
@Html.ValidationSummary(true)
<span>
Date 1 @Html.TextBoxFor(m => m.Date1)
@Html.ValidationMessageFor(m => m.Date1)<br />
Date 2 @Html.TextBoxFor(m => m.Date2)
@Html.ValidationMessageFor(m => m.Date2)<br />
<input type="submit" value="Search" />
</span>
}
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
<script>
$(function () {
$("#Date1").datepicker();
$("#Date2").datepicker();
});
</script>
答案 1 :(得分:0)
只需将类型从DateTime?
更改为DateTime
即可实现您的目标。您可以在第一个操作中将值设置为DateTime.Now
,或将其保留为默认的无符号。要么在视图中工作。
编辑:这是我在dotnetfiddle中的意思:https://dotnetfiddle.net/Ei0LeQ