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 现在..我需要做些什么来接受你的回答吗?还是就这样,结案?抱歉.. 在 *** 上还是新手 太好了,很高兴它成功了。点击答案旁边的复选标记,将其从空心切换为绿色。此链接包含有关如何接受答案的说明:meta.stackexchange.com/questions/5234/…

以上是关于modelstate.isvalid false 因为该项目始终为空的主要内容,如果未能解决你的问题,请参考以下文章

当模型具有外键时,ModelState.IsValid 为 false

c# -ModelState.IsValid 仅在资源语言更改时返回 false?

尝试保存实体时 ModelState.isvalid 为 false,错误表示相关实体中需要字段

EmailAddress DataAnnotation 在 View 上标记为有效但 ModelState.IsValid = false?

modelstate.isvalid false 因为该项目始终为空

为啥我的 MVC 应用程序中的 ModelState.IsValid 属性在我看来一切正常时等于 false