ASP.NET MVC 5 ModelState.IsValid 在 MVC 中总是返回 false
ASP.NET MVC 5 ModelState.IsValid is always returning false in MVC
我每次都面临 ModelState.IsValid 错误。我调试了整个动作。当我展开 ModelState 错误部分时,我发现 System.Web.Mvc.Model 错误。在我的模型中,Status 属性通过数据注释声明为 Required。所以基本上错误表明我的状态在模型中是必需的。这就是它给出验证错误的原因。
这是我的模型
public class CompanyResource
{
[Key]
public int Id { get; set; }
[Required]
[StringLength(100)]
public string Name { get; set; }
[StringLength(100)]
public string Position { get; set; }
[Display(Name="Date of Joining")]
public DateTime? DOJ { get; set; }
[StringLength(50)]
public string Phone { get; set; }
[StringLength(100)]
public string Address { get; set; }
[StringLength(1)]
[Required]
public string Status { get; set; }
public virtual ICollection<ProjectResource> ProjectResources { get; set; }
public virtual ICollection<ProjectSiteResource> ProjectSiteResources { get; set; }
}
}
这是我的行动
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,Name,Position,DOJ,Phone,Address,Status")] CompanyResource companyResource)
{
var isAjaxRequest = Request.IsAjaxRequest();
ModelState["Status"].Errors.Clear();
if (ModelState.IsValid)
{
db.CompanyResource.Add(companyResource);
db.SaveChanges();
if (isAjaxRequest)
{
var staff = new SelectList(db.CompanyResource.ToList(), "Id", "Name");
return Json(new { Flag = true, CompanyResources = staff }, JsonRequestBehavior.AllowGet);
}
Success(string.Format("Successfully save data !"), true);
return RedirectToAction("Index");
}
if (!isAjaxRequest) return View(companyResource);
return Json(null, JsonRequestBehavior.AllowGet);
}
这是我在同一控制器中的另一种方法
public JsonResult GetStaff()
{
try
{
var staff = new SelectList(db.CompanyResource.ToList(), "Id", "Name");
return Json(new { Flag = true, CompanyResources = staff }, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
return Json(new { Flag = false, Msg = ex.Message }, JsonRequestBehavior.AllowGet);
}
}
这是我的观点
<div class="form-group">
@Html.Label("Status", htmlAttributes: new { @class = "control-label col-md-2", @required = "required" })
<div class="col-md-10">
<select class="form-control" id="Status">
<option value="A">Active</option>
<option value="I">Inactive</option>
</select>
</div>
</div>
在对您的问题的评论中,您指出这是您的 HTML 和型号:
<select class="form-control" id="Status">
<option value="A">Active</option>
<option value="I">Inactive</option>
</select>
[StringLength(1)] [Required] public string Status { get; set; }
您需要设置 select 标记的 name
属性以使 MVC 绑定起作用。所以像这样添加名称:
<select class="form-control" id="Status" name="Status">
<option value="A">Active</option>
<option value="I">Inactive</option>
</select>
我每次都面临 ModelState.IsValid 错误。我调试了整个动作。当我展开 ModelState 错误部分时,我发现 System.Web.Mvc.Model 错误。在我的模型中,Status 属性通过数据注释声明为 Required。所以基本上错误表明我的状态在模型中是必需的。这就是它给出验证错误的原因。
这是我的模型
public class CompanyResource
{
[Key]
public int Id { get; set; }
[Required]
[StringLength(100)]
public string Name { get; set; }
[StringLength(100)]
public string Position { get; set; }
[Display(Name="Date of Joining")]
public DateTime? DOJ { get; set; }
[StringLength(50)]
public string Phone { get; set; }
[StringLength(100)]
public string Address { get; set; }
[StringLength(1)]
[Required]
public string Status { get; set; }
public virtual ICollection<ProjectResource> ProjectResources { get; set; }
public virtual ICollection<ProjectSiteResource> ProjectSiteResources { get; set; }
}
}
这是我的行动
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,Name,Position,DOJ,Phone,Address,Status")] CompanyResource companyResource)
{
var isAjaxRequest = Request.IsAjaxRequest();
ModelState["Status"].Errors.Clear();
if (ModelState.IsValid)
{
db.CompanyResource.Add(companyResource);
db.SaveChanges();
if (isAjaxRequest)
{
var staff = new SelectList(db.CompanyResource.ToList(), "Id", "Name");
return Json(new { Flag = true, CompanyResources = staff }, JsonRequestBehavior.AllowGet);
}
Success(string.Format("Successfully save data !"), true);
return RedirectToAction("Index");
}
if (!isAjaxRequest) return View(companyResource);
return Json(null, JsonRequestBehavior.AllowGet);
}
这是我在同一控制器中的另一种方法
public JsonResult GetStaff()
{
try
{
var staff = new SelectList(db.CompanyResource.ToList(), "Id", "Name");
return Json(new { Flag = true, CompanyResources = staff }, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
return Json(new { Flag = false, Msg = ex.Message }, JsonRequestBehavior.AllowGet);
}
}
这是我的观点
<div class="form-group">
@Html.Label("Status", htmlAttributes: new { @class = "control-label col-md-2", @required = "required" })
<div class="col-md-10">
<select class="form-control" id="Status">
<option value="A">Active</option>
<option value="I">Inactive</option>
</select>
</div>
</div>
在对您的问题的评论中,您指出这是您的 HTML 和型号:
<select class="form-control" id="Status">
<option value="A">Active</option>
<option value="I">Inactive</option>
</select>
[StringLength(1)] [Required] public string Status { get; set; }
您需要设置 select 标记的 name
属性以使 MVC 绑定起作用。所以像这样添加名称:
<select class="form-control" id="Status" name="Status">
<option value="A">Active</option>
<option value="I">Inactive</option>
</select>