【问题标题】:ModelState.IsValid does not update once I change input fields to valid inputs一旦我将输入字段更改为有效输入,ModelState.IsValid 不会更新
【发布时间】:2017-07-21 00:30:35
【问题描述】:

我有一个“MovieForm”表单,用于将电影添加到数据库。当我填写所有必需的输入并按下保存按钮时,电影会正常添加到数据库中。如果我首先将一个或多个必需的输入留空,然后按保存,我会收到 DataAnnotations 错误消息,“ModelState.isValid”变为错误并重定向我已使用此代码的相同表单:

[HttpPost]
public ActionResult Save(Movie movie)
{
    if (!ModelState.IsValid)
    {  
        return View("MovieForm");
    }

  //logic for saving movie 
}

这就是它应该做的。此操作后会出现问题。现在,当我填写所有必需的输入并再次按下保存按钮时,ModelState.IsValid 没有更新并且它仍然是错误的,所以我陷入了这个 if 语句。

如何重置它,以便再次检查是否满足要求?

型号:

public class Movie
{
    [Key]
    public Guid MovieID { get; set; }

    [Required]
    [StringLength(40)]
    public string Title { get; set; }

    [Required]
    [StringLength(60)]
    public string Director { get; set; }

    [Required]
    [StringLength(256)]
    public string Actors { get; set; }
}

查看

@using Cinema.Models
@model Cinema.Models.Movie

@using (Html.BeginForm("Save", "Movies", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
<div class="form-group">
    @Html.LabelFor(m => m.Title, "Title", new { @class = "col-md-2 control-label" })
    <div class="col-md-8">
        @Html.TextBoxFor(m => m.Title, new { @class = "form-control col-md-4" })
        @Html.ValidationMessageFor(m => m.Title, "", new { @class = "text-danger col-md-4 form-control-static" })
    </div>
 </div>
<div class="form-group">
    @Html.LabelFor(m => m.Director, "Director", new { @class = "col-md-2 control-label" })
    <div class="col-md-8">
        @Html.TextBoxFor(m => m.Director, new { @class = "form-control col-md-4" })
        @Html.ValidationMessageFor(m => m.Director, "", new { @class = "text-danger col-md-4 form-control-static" })
    </div>
</div>
<div class="form-group">
    @Html.LabelFor(m => m.Actors, "Actors ", new { @class = "col-md-2 control-label" })
    <div class="col-md-8">
        @Html.TextBoxFor(m => m.Actors, new { @class = "form-control col-md-4" })
        @Html.ValidationMessageFor(m => m.Actors, "", new { @class = "text-danger col-md-4 form-control-static" })
    </div>
</div>

@Html.HiddenFor(m => m.MovieID)

<div class="form-group">
    <div class="col-md-offset-2 col-md-4">
        <input type="submit" class="btn btn-default" value="Save" />
        <a class="col-md-offset-1" href="/Movies/">cancel</a>
    </div>
</div>
}

【问题讨论】:

  • 这根本不可能,除非您有其他代码导致问题。还要注意它应该是return View("MovieForm", movie);
  • 好吧,我进行了调试,一旦ModelState.isValid 获得值false,当具有所有有效值的对象movie 传递给Save 操作时,它不会更改/更新它。我也尝试按照您的建议添加电影,但没有解决问题。
  • 您没有显示任何相关代码,因此我们无法猜测您犯了什么错误。
  • 我不确定您希望我显示什么代码?除了这个动作之外,唯一与之相关的就是MovieForm 本身。
  • 显示模型和视图。 ModelStateIsValid 不能是 false,除非您的模型无效。但首先在您的 POST 方法中包含 var errors = ModelState.Keys.Where(k =&gt; ModelState[k].Errors.Count &gt; 0).Select(k =&gt; new { propertyName = k, errorMessage = ModelState[k].Errors[0].ErrorMessage }); 以准确检查哪些属性无效

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


【解决方案1】:

您可以通过在调试模式下展开 ModelState 对象来检查错误

【讨论】:

    【解决方案2】:

    Stephen 在评论中的建议提供了一种非常简洁的过滤 ModelState 以查看导致错误的原因的方法。我做了类似的事情(虽然比较长)将它们组合成一个字符串以便于查看/复制/粘贴。尝试将其添加到您的控制器:

        string modelErrors = GetModelStateErrors(ModelState);
    

    调用这个方法:

        public string GetModelStateErrors(ModelStateDictionary ms)
        {
            StringBuilder errors = new StringBuilder();
            foreach (string k in ms.Keys)
            {
                if (ms[k].Errors.Count > 0)
                {
                    errors.Append($"\n{k}:\n");
                    foreach (var e in ms[k].Errors)
                    {
                        errors.Append($"   {e.ErrorMessage}\n");
                    }
                }
            }
            return errors.ToString();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 2022-12-15
      • 2019-02-08
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多