为什么我的模型验证失败

时间:2017-09-06 17:53:57

标签: c# asp.net-mvc

当我第一次加载页面时,我的日期文本框都未通过验证。 这似乎是因为两个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();
}

2 个答案:

答案 0 :(得分:2)

日期时间输入非常敏感。用户可能会输入拼写错误, ModelBinder 将无法将其绑定到参数。因此,我建议您使用jQuery UI DatepickerKendo Datepicker等框架。

enter image description here enter image description here

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