Asp.net mvc 4 MVC中的模型验证不起作用

Asp.net mvc 4 MVC中的模型验证不起作用,asp.net-mvc-4,Asp.net Mvc 4,这个问题的可能原因和解决方案是什么?为什么不起作用?我在这里待了将近一个小时,不知道出了什么问题 查看 @model Sanipex.Models.WarehouseGoodsIN @using (Html.BeginForm()) { <div align="center"> @Html.TextBoxFor(model => model.missinglabel) @Html.ValidationMessageFor(model => model.mi

这个问题的可能原因和解决方案是什么?为什么不起作用?我在这里待了将近一个小时,不知道出了什么问题

查看

@model Sanipex.Models.WarehouseGoodsIN
@using (Html.BeginForm())
{
<div align="center">
    @Html.TextBoxFor(model => model.missinglabel)
    @Html.ValidationMessageFor(model => model.missinglabel)
</div>
<input type="submit" name="btnsubmit" value="Confirm"/>
}
控制器

public ActionResult ScanLabel(WarehouseGoodsIN goodsin, string btnsubmit)
{
      if (btnsubmit == "Confirm") 
      {
          if (ModelState.IsValid) //modelstate value is false 
          {
             db.WarehouseGoodsINs.Add(goodsin);
             db.SaveChanges();
          }
          return RedirectToAction("ScanLabelMenu");
      }
}

首先,您的视图中缺少
submit
按钮可能会出现问题。因此,您的代码应该如下所示:

@model Sanipex.Models.WarehouseGoodsIN
@using (Html.BeginForm())
{
<div align="center">
    @Html.TextBoxFor(model => model.missinglabel)
    @Html.ValidationMessageFor(model => model.missinglabel)
    <input type="submit" value="Send"/>

</div>
}

若modelState无效,您应该再次将模型传递给视图,因为验证元数据存储在模型中

[HttpPost]
public ActionResult ScanLabel(WarehouseGoodsIN goodsin, string btnsubmit)
{
    if (btnsubmit == "Confirm") 
    {
        if (ModelState.IsValid) //modelstate value is false 
        {
             db.WarehouseGoodsINs.Add(goodsin);
             db.SaveChanges();

             return RedirectToAction("ScanLabelMenu");
        }
        else
        {
            // this line is necessary for model validation
            return View(goodsin);
        }
    }
}
此外,您不需要检查是否单击了提交按钮


更新

就在
if(ModelState.IsValid)
删除Id索引之前,使用这一行
ModelState.remove(“Id”)
当MVC团队删除此错误时,您只需要删除项目的这一行代码

在使用MVC5、数据库优先和实体框架6时仍然存在此问题。但只有在使用ViewModels时才具有

查看

@model Sanipex.Models.WarehouseGoodsIN
@using (Html.BeginForm())
{
    <div align="center">
        @Html.TextBoxFor(model => model.missinglabel)
        @Html.ValidationMessageFor(model => model.missinglabel)
    </div>
    <input type="submit" name="btnsubmit" value="Confirm"/>
}

这是构建ViewModel的方式,我发现关键数据注释没有任何用处

Public int ID { get; set; }
[Required]
Public string MissingLabel { get; set; }
从这里构造类似于您所做的操作(下面的示例)


尝试按顺序添加以下内容:

首先

然后


你能添加你的控制器代码吗?确保你正在使用输入类型提交按钮来发布表单数据…@AliRızaAdıyahşi包括控制器代码一个问题,当你在操作中设置断点时,是否传递了ID?您已经声明ID是一个键,请确保将其作为找不到的键传入,然后它将找到一个错误(虽然不是100%确定,但从未需要过键数据注释)。只需在渲染视图时将其添加为隐藏的文本框,或者去掉ID上的KEY属性,看看会发生什么。如果它在没有键的情况下工作,那就是你的问题。@Damian如果我删除“If(ModelState.IsValid)”文本框中的值,它将保存到数据库中。这意味着它有价值,对吗?我在文本框中输入的值正在传递给模型。我的意思是,如果我删除if(ModelState.IsValid),文本框中的值将保存到数据库中。我已经知道我的错误了,我很愚蠢哈哈。还有一个问题,我如何将validate放入@Html.TextBox(“txtfirstname”)中,将
txtfirstname
添加到您的模型中,或者创建一个viewmodel。对于模型编辑操作,请始终使用viewmodels,以便您可以根据需要添加新对象…我如何解释这一点?我不能每次都使用模型。我的项目就像一个移动应用程序。一步一步的例子。我有型号Id、姓名、地址。我的页面是一次一页。输入姓名,然后转到另一页,在完成所有操作后输入地址。我将把它保存到数据库中。我使用session存储值:)在“ModelState.IsValid”上放置一个断点,当您滚动到ModelState上时,展开“values”部分。然后检查每个结果,看看抛出了什么错误。@Damian检查用户在回答中的注释
@model Sanipex.Models.WarehouseGoodsIN
@using (Html.BeginForm())
{
    <div align="center">
        @Html.TextBoxFor(model => model.missinglabel)
        @Html.ValidationMessageFor(model => model.missinglabel)
    </div>
    <input type="submit" name="btnsubmit" value="Confirm"/>
}
[HttpPost]
public ActionResult ScanLabel(WarehouseGoodsIN goodsin, string btnsubmit)
{
    if (btnsubmit == "Confirm") 
    {
        ModelState.Remove("Id")
        if (ModelState.IsValid) //modelstate value is false 
        {
             db.WarehouseGoodsINs.Add(goodsin);
             db.SaveChanges();

             return RedirectToAction("ScanLabelMenu");
        }
        else
        {
            // this line is necessary for model validation
            return View(goodsin);
        }
    }
}
Public int ID { get; set; }
[Required]
Public string MissingLabel { get; set; }
[HttpPost]
Public ActionResult ActionName(WarehouseGoodsIN model)
{
    if(ModelState.IsValid)
    {
      //Do Something
    }

    Return View(mode)
}
@Scripts.Render("~/bundles/jquery")   
@Scripts.Render("~/bundles/jqueryval")