首页 > 解决方案 > View 没有在回发时返回整个模型

问题描述

我创建了一个模型、视图和控制器。在我看来,我遍历了 的集合,并创建了一个包含每个列表的表格,以及一个保存按钮。

当我单击“保存”按钮时,返回给控制器的唯一数据是 ID 和 LandownerID——所有其他字段都显示为空。

我今天大部分时间都在搜索谷歌,并尝试了多个答案,但都没有奏效。

控制器:

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit([Bind(Include = "ID,ExemptionNumber,IssueDate,KillCount,TRAPPING,SHOOTING,DOGS,OTHER,NO_INDICATION,NOTES,SPECIES,E_LANDOWNER,EXEM_YEAR,MethodOfDisposal,NO_DATA")] ExempKillData exempKillData)
        {
            if (ModelState.IsValid)
            {
                db.Entry(exempKillData).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index","Owners");
            }
            return View(exempKillData);
        }

看法:

@model IEnumerable<Exemptions.Models.ExempKillData>

@{
    ViewBag.Title = "Edit";
    Layout = "~/Views/Shared/_Layout.cshtml";
}



<h2>Edit</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <table border="1" id="tbl">
        <tbody>
            ..table headers snipped...
            @foreach (var kill in Model)
            {
                <tr>
                    <td>
                        @Html.EditorFor(model => Model.First().ID, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
                    </td>
                    <td>
                        @Html.EditorFor(model => Model.First().ExemptionNumber, new { htmlAttributes = new { @class = "form-control", @readonly = "readonly" } })
                    </td>
                    <td valign="top">
                        @Html.EditorFor(model => kill.IssueDate, new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => kill.IssueDate, "", new { @class = "text-danger" })
                    </td>
                    <td valign="top">
                        @Html.EditorFor(model => kill.KillCount, new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => kill.KillCount, "", new { @class = "text-danger" })
                    </td>
                    <td valign="top">
                        @Html.EditorFor(model => kill.TRAPPING, new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => kill.TRAPPING, "", new { @class = "text-danger" })
                    </td>
                    <td valign="top">
                        @Html.EditorFor(model => kill.SHOOTING, new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => kill.SHOOTING, "", new { @class = "text-danger" })
                    </td>
                    <td valign="top">
                        @Html.EditorFor(model => kill.DOGS, new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => kill.DOGS, "", new { @class = "text-danger" })
                    </td>
                    <td valign="top">
                        @Html.EditorFor(model => kill.OTHER, new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => kill.OTHER, "", new { @class = "text-danger" })
                    </td>
                    <td valign="top">
                        @Html.EditorFor(model => kill.NO_INDICATION, new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => kill.NO_INDICATION, "", new { @class = "text-danger" })
                    </td>
                    <td valign="top">
                        @Html.EditorFor(model => kill.NOTES, new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => kill.NOTES, "", new { @class = "text-danger" })
                    </td>
                    <td valign="top">
                        @Html.EditorFor(model => kill.SPECIES, new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => kill.SPECIES, "", new { @class = "text-danger" })
                    </td>
                    <td valign="top">
                        @Html.EditorFor(model => kill.E_LANDOWNER, new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => kill.E_LANDOWNER, "", new { @class = "text-danger" })
                    </td>
                    <td valign="top">
                        @Html.EditorFor(model => kill.EXEM_YEAR, new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => kill.EXEM_YEAR, "", new { @class = "text-danger" })
                    </td>
                    <td valign="top">
                        @Html.EditorFor(model => kill.NO_DATA, new { htmlAttributes = new { @class = "form-control" } })
                        @Html.ValidationMessageFor(model => kill.NO_DATA, "", new { @class = "text-danger" })
                    </td>
                    <td valign="top" align="center">
                        <input type="submit" value="Save"  class="btn btn-default" />
                    </td>
                </tr>
            }
        </tbody>
    </table>

}

模型:

    [Table("WHE.ExempKillData")]
    public partial class ExempKillData
    {
        [Display(Name ="Exemption Number")]
        public int? ExemptionNumber { get; set; }

        [Display(Name = "Issue Date")]
        [Column(TypeName = "datetime2")]
        [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
        public DateTime? IssueDate { get; set; }

        [Display(Name = "Kill Count")]
        public int? KillCount { get; set; }

        public int? TRAPPING { get; set; }

        [Column(TypeName = "numeric")]
        public int? SHOOTING { get; set; }

        public int? DOGS { get; set; }

        [Column(TypeName = "numeric")]
        public int? OTHER { get; set; }

        [Display(Name ="No Indication")]
        public int? NO_INDICATION { get; set; }

        [StringLength(200)]
        public string NOTES { get; set; }

        [StringLength(32)]
        public string SPECIES { get; set; }

        [Display(Name ="Landowner")]
        public double? E_LANDOWNER { get; set; }

        [Display(Name ="Exemption Year")]
        [StringLength(4)]
        public string EXEM_YEAR { get; set; }

        [Display(Name ="No Data")]
        [StringLength(40)]
        public string NO_DATA { get; set; }

        public string MethodOfDisposal { get; set; }

        public int ID { get; set; }

    }
}

我希望单击 Save 会将该行的内容返回到 Controller Action,然后可以在其中正确保存数据。

ModelState.IsValid 对于我尝试编辑的每条记录都是正确的,但如上所述,除了 ID 和 E_Landowner 之外的所有字段都为空。

标签: c#asp.net-mvcrazor

解决方案


当您提出请求时,您是否查看过检查器中的“网络”选项卡?参数如下所示:

在此处输入图像描述

您现在可以对您的环境进行测试。检查未正确绑定的元素,然后删除“kill”。从它的名字:

在此处输入图像描述

当你按下保存时,这个单一的属性应该被正确绑定

问题是,当您制作 'EditorFor(model => kill.IssueDate ) 时,粗体文本将是您发出请求时的参数名称。因此,如果您的模型具有 ExempKillData 类型的属性,并命名为“kill”,那么绑定将起作用。

不过不用担心,我知道你想做什么。

换行就好

@Html.EditorFor(model => kill.IssueDate, new { htmlAttributes = new { @class = "form-control" } })

@Html.EditorFor(model => kill.IssueDate, null, "IssueDate", new { htmlAttributes = new { @class = "form-control" } });

第二个参数是一个模板,它不是我们对该示例感兴趣的模板,但第三个参数告诉 ASP.NET 为该属性设置不同的字段名称。

在解释方面我很无聊,但我希望你明白了:)

顺便提一句。您可以从方法参数中删除所有这些“绑定”文本。只需要参数的类型和名称

在此处输入图像描述


推荐阅读