MVC中的模型验证不起作用

时间:2014-07-04 07:05:28

标签: asp.net-mvc-4

这个问题的可能原因和解决方案是什么?为什么不工作我在这里待了差不多一个小时不知道是什么问题。

查看

@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"/>
}

MODEL

public class WarehouseGoodsIN
    {
        [Key]
        public int Id { get; set; }

        [Required]
        public int missinglabel { get; set; }
    }

CONTROLLER

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");
      }
}

4 个答案:

答案 0 :(得分:0)

首先,您的视图中缺少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>
}

此外,您应该考虑使用服务器端验证。例如:

[HttpPost]
public ActionResult YourAction(WarehouseGoodsIN model)
{

    if (ModelState.IsValid)
    {
        //some logic here
    }
    else
    {
        return View(model);
    }

}

答案 1 :(得分:0)

如果modelState无效,则应将模型再次传递给view,因为验证元数据存储在模型中。

[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)使用此行ModelState.Remove("Id")删除Id索引之前,当MVC团队删除此错误时,您只需删除项目的此行代码。

使用MVC 5,数据库优先和实体框架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"/>
}

<强>控制器

[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);
        }
    }
}

答案 2 :(得分:0)

这是构建ViewModel的方式,我发现没有使用KEY数据注释。

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)
}

答案 3 :(得分:0)

尝试按顺序添加这些:

第一

@Scripts.Render("~/bundles/jquery")   

然后

@Scripts.Render("~/bundles/jqueryval")