modelstate.isvalid false 因为该项目始终为空
Posted
技术标签:
【中文标题】modelstate.isvalid false 因为该项目始终为空【英文标题】:modelstate.isvalid false because the item always null 【发布时间】:2018-10-07 00:48:03 【问题描述】:所以我尝试制作一个 asp.net core 2 (visual studio 2017)。试图为主银行制作一个简单的视图,新建,编辑,删除。我在视图上取得了成功并创建了新的,但现在我被困在了编辑部分。因此,当用户单击编辑时,我打开新窗口并显示详细信息供他们编辑,然后当他们单击保存按钮时,我保存了值(例如在创建新窗口时)。就是这么简单。但由于某种原因,用于编辑的 modelstate.isvalid 始终为 false,当我尝试调试时,我发现所有项目都返回 null(它们都显示在视图上),除了主键。请帮助我做错了什么:
班级:
公共课 MsBank [必需(错误消息 =“必需。”)] [RegularExpression(@"\b[A-Z0-9]1,\b", ErrorMessage = "必须大写")] 公共字符串银行代码 获取;放; [必需(错误消息 =“必需。”)] 公共字符串银行名称 获取;放; 公共字符串 BankBranch 获取;放; 私人 SqlConnection con; 私人无效连接() PrjCommon dbhandle = new PrjCommon(); con = new SqlConnection(dbhandle.GetSetting()); public bool AddBank(List smodel) 联系(); SqlCommand cmd = new SqlCommand("SaveMsBank", con); cmd.CommandType = CommandType.StoredProcedure; foreach(smodel 中的变量项) cmd.Parameters.AddWithValue("@BankCode", item.BankCode); cmd.Parameters.AddWithValue("@BankName", item.BankName); cmd.Parameters.AddWithValue("@BankBranch", item.BankBranch); cmd.Parameters.AddWithValue("@LastUpdatedBy", "Me"); cmd.Parameters.AddWithValue("@LastUpdatedFromModule", "NET"); con.Open(); int i = cmd.ExecuteNonQuery(); con.Close(); 如果 (i >= 1) 返回真; 别的 返回假;观点:
@model 列表[MsBank] @ ViewData["Title"] = "编辑"; @using (html.BeginForm()) @Html.AntiForgeryToken() @foreach(模型中的变量项) 代码 : @Html.EditorFor(model => item.BankCode, new htmlAttributes = new @class= "form-control" ) @Html.ValidationMessageFor(model => item.BankCode, "", new @class= "text-danger" ) 姓名 : @Html.EditorFor(model => item.BankName, new htmlAttributes = new @class= "form-control" ) @Html.ValidationMessageFor(model => item.BankName, "", new @class= "text-danger" ) 分支 : @Html.EditorFor(model => item.BankBranch, new htmlAttributes = new @class= "form-control" ) @Html.ValidationMessageFor(model => item.BankBranch, "", new @class= "text-danger" ) @ViewBag.Message @Html.ActionLink("返回列表", "索引") @section 脚本 @await Html.RenderPartialAsync("_ValidationScriptsPartial");和控制器:
公共 ActionResult 编辑(字符串 BankCode) MsBank ms = 新的 MsBank(); 模型状态.清除(); 返回视图(ms.GetData(银行代码)); [HttpPost] [验证AntiForgeryToken] public ActionResult Edit(string BankCode,List smodel) 尝试 如果(模型状态。IsValid) 如果(smodel.Count > 0) MsBank ms = 新的 MsBank(); if (ms.AddBank(smodel)) ViewBag.Message = "银行编辑成功"; 模型状态.清除(); return RedirectToAction("索引"); else ViewBag.Message = "空记录"; 返回视图(模型); 捕获(异常 e) ViewBag.Message = e.ToString(); 返回视图(模型);所以,为了更清楚起见,上面的 modelstate.isvalid 返回 false(调试时我发现),因为 bankname 是无效的,因为它是 null,所以 bankbranch 也是 null
【问题讨论】:
【参考方案1】:在我看来,您的观点正在接受 msbank @model IEnumerable [WBMS.Models.MsBank]
的 IEnumerable,而实际上它应该只接受它的单个实例。然后,您将遍历模型,这会将编辑视图上的表单字段名称从 BankCode
更改为 item_BankCode
,这就是您在这些值上返回 null 的原因。
尝试将您的编辑视图更改为:
@model WebApplication2.Models.MsBank
@
ViewData["Title"] = "Edit";
@using (Html.BeginForm())
@Html.AntiForgeryToken()
@:Code:
@Html.EditorFor(model => model.BankCode, new htmlAttributes = new
@class = "form-control" )
@Html.ValidationMessageFor(model => model.BankCode, "", new
@class = "text-danger"
)
@:Name:
@Html.EditorFor(model => model.BankName, new htmlAttributes = new
@class = "form-control" )
@Html.ValidationMessageFor(model => model.BankName, "", new
@class = "text-danger"
)
@:Branch:
@Html.EditorFor(model => model.BankBranch, new htmlAttributes = new
@class = "form-control" )
@Html.ValidationMessageFor(model => model.BankBranch, "", new
@class = "text-danger"
)
<button type="submit">Submit</button>
@ViewBag.Message
@Html.ActionLink("Back to List", "Index")
【讨论】:
感谢您的回答。你指出我正确的方向。我创建了一个列表是错误的,但是我在视图上使用了 IEnumerable,然后我在控制器上使用类作为参数。请再次查看第 1 篇文章,我已将其编辑为我所做的所有更改,因此全部使用 List,但现在对于 httppost 之后的编辑,已返回 model.isvalid true,但 smodel 未返回任何记录。我哪里做错了? 澄清一下,您的ms.GetData(BankCode)
方法检索MsBank
的列表?
再次尝试后,我完全明白你的意思了。所以我不应该使用每个,而是使用其他方法,所以我用 @for (var i=0;i以上是关于modelstate.isvalid false 因为该项目始终为空的主要内容,如果未能解决你的问题,请参考以下文章
当模型具有外键时,ModelState.IsValid 为 false
c# -ModelState.IsValid 仅在资源语言更改时返回 false?
尝试保存实体时 ModelState.isvalid 为 false,错误表示相关实体中需要字段
EmailAddress DataAnnotation 在 View 上标记为有效但 ModelState.IsValid = false?