【问题标题】:Validation does not work when leave field empty将字段留空时验证不起作用
【发布时间】:2019-05-24 21:59:07
【问题描述】:

我正在尝试为视图中的字段创建验证,因此如果用户将它们留空,则会在每个字段下显示一条验证消息。

我的问题是每次我通过将其中一个字段留空来测试验证时,都会收到 context.SaveChanges() 错误,并收到此消息

一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性,问题出在哪里?

这是我的模型

public class NewsViewModel
{
    public int Id { get; set; }
    [Required(ErrorMessage = "Title is required")]
    public string Title { get; set; }
    [Required(ErrorMessage = "Text is required")]
    public string Text { get; set; }

}

这是我的控制器,

public ActionResult AlterNews(News model )
{
    var context = new BackOfficeEntities();
    if (ModelState.IsValid)
    {

            var update = context.News.SingleOrDefault(x => x.Id == model.Id);

            update.Title = model.Title;
            update.Text = model.Text;
            context.SaveChanges();
            return RedirectToAction("Index", "News");       
    }
    return View(model);
}

最后是视图

@using (Html.BeginForm("AlterNews", "News"))
{
    @Html.AntiForgeryToken()

    @Html.ValidationSummary("", new { @class = "text-danger" })

    <fieldset>
        <div class="col-md-4">
            <div class="form-group">
                @Html.HiddenFor(Model => Model.Id, new { @class = "control-label" })

                @Html.LabelFor(Model => Model.Title)
                @Html.TextBoxFor(Model => Model.Title, new { @class = "form-control" })
                @Html.ValidationMessageFor(Model => Model.Title)
            </div>

            <div class="form-group">


                @Html.LabelFor(Model => Model.Text, new { @class = "control-label" })
                @Html.TextAreaFor(Model => Model.Text, new { @class = "form-control", rows = "10" })
                @Html.ValidationMessageFor(Model => Model.Text)
            </div>
        </div>

    </fieldset>
    <div class="col-md-4">

        <button type="submit" class="btn btn-default" name="buttonSubmit" value="Edit News">Edit News</button>
    </div>
}
@section scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

【问题讨论】:

  • 您有很多问题(与问题无关)。您似乎没有使用AntiForgeryToken 来防止跨站点伪造。您的 label 标签 for 属性不指向其他 HtmlElement Id(只是非标准)。你不需要retrieve the object from the database to update it (that's just more overhead)
  • 您收到哪些验证错误消息?
  • 让我们知道错误的含义; catch (DbEntityValidationException e) { foreach (e.EntityValidationErrors 中的变量)
  • 错误是来自数据库的验证,因为我将文本字段留空以确保验证将在页面上工作,但它没有,这就是我收到错误的原因。该错误在这里并不重要,因为它没有说明为什么我的验证不起作用...
  • 这个 NewsViewModel 有用吗?您的控制器正在接受公共 ActionResult AlterNews(新闻模型),它们是两个不同的对象

标签: c# asp.net-mvc validation razor


【解决方案1】:

您可以尝试检查底层验证错误,这将为您提供导致错误的提示。

try{

      var update = context.News.SingleOrDefault(x => x.Id == model.Id);

      update.Title = model.Title;
      update.Text = model.Text;
      context.SaveChanges();

}
catch(DbEntityValidationException ex)
{
        StringBuilder result = new StringBuilder();
        var entityErrors = ex.EntityValidationErrors;

        foreach (var entity in entityErrors)
        {
            foreach (var error in entity.ValidationErrors)
            {
                result.Append(error.PropertyName + " - " + error.ErrorMessage + "\n");
            }
        }        
        throw;
}

【讨论】:

  • 这个答案如何解决问题 我的问题是每次我通过将其中一个字段留空来测试验证时,我都会收到 context.SaveChanges() 错误?这看起来像是找到问题的一个步骤,但它根本没有解决问题。
猜你喜欢
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多