【问题标题】:modelstate.isvalid false because the item always nullmodelstate.isvalid false 因为该项目始终为空
【发布时间】: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

【问题讨论】:

    标签: asp.net


    【解决方案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
    • 现在..我需要做些什么来接受你的回答吗?还是就这样,结案?抱歉.. 在 stackoverflow 上还是新手
    • 太好了,很高兴它成功了。点击答案旁边的复选标记,将其从空心切换为绿色。此链接包含有关如何接受答案的说明:meta.stackexchange.com/questions/5234/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多