c# - 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 之外的所有字段都为空。
解决方案
当您提出请求时,您是否查看过检查器中的“网络”选项卡?参数如下所示:
您现在可以对您的环境进行测试。检查未正确绑定的元素,然后删除“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 为该属性设置不同的字段名称。
在解释方面我很无聊,但我希望你明白了:)
顺便提一句。您可以从方法参数中删除所有这些“绑定”文本。只需要参数的类型和名称
推荐阅读
- excel - VB.Net 将 Excel 文件转换为 PDF:ExportAsFixedFormat 出错
- python - 如何在“类”对象中实现“装饰器”功能?
- r - 将 ccache 与 Stan 模型一起使用
- flutter - 什么是 WidgetsFlutterBinding 以及它是如何在 Flutter 应用程序中使用的?
- python - 如何从日期获取月份和年份
- python-3.x - Python ThreadPoolExecutor 和 psycopg2 -- 进程在完成前退出
- javascript - 附加动态表行时的语法和转义字符错误
- swift - 从非抛出方法中捕获错误
- html - Html正在用换行符呈现空白
- javascript - 使用 javascript 或 jquery 旋转 svg 元素 3d