c# - 已发布数组中的一个字段未绑定到模型
问题描述
为了清晰和保密,我有以下视图模型:
public class BoqReviewViewModel
{
public List<BoqReviewItemViewModel> Items { get; set; } = new List<BoqReviewItemViewModel>();
}
public static BoqReviewItemViewModel FromEntity(GTT_BOQ_IMPORT import)
{
var ret = new BoqReviewItemViewModel();
ret.BOQ_IMPORT_ID = import.BOQ_IMPORT_ID;
ret.ITEM_CODE = import.ITEM_CODE;
ret.ITEM_DESC = import.ITEM_DESC;
ret.UNIT = import.UNIT;
ret.QTY = import.QTY;
ret.RATE = import.RATE;
ret.AMOUNT = import.AMOUNT;
ret.ITEM_PAYS = import.ITEM_PAYS;
ret.ITEM_CPA = import.ITEM_CPA;
return ret;
}
public GTT_BOQ_IMPORT ToEntity()
{
var ret = new GTT_BOQ_IMPORT();
ret.BOQ_IMPORT_ID = this.BOQ_IMPORT_ID;
ret.ITEM_CODE = this.ITEM_CODE;
ret.ITEM_DESC = this.ITEM_DESC;
ret.UNIT = this.UNIT;
ret.QTY = this.QTY;
ret.RATE = this.RATE;
ret.AMOUNT = this.AMOUNT;
ret.ITEM_PAYS = this.ITEM_PAYS;
ret.ITEM_CPA = this.ITEM_CPA;
return ret;
}
[Key]
public Guid BOQ_IMPORT_ID;
public string ITEM_CODE { get; set; }
public string ITEM_DESC { get; set; }
public string UNIT { get; set; }
public decimal? QTY { get; set; }
public decimal? RATE { get; set; }
public decimal? AMOUNT { get; set; }
public bool? ITEM_PAYS { get; set; }
public bool? ITEM_CPA { get; set; }
public bool IsFlagged { get; set; }
}
然后我对索引类型视图有以下 GET 操作:
[HttpGet]
public ActionResult BoqReview()
{
var model = new BoqReviewViewModel();
model.CONTRACT_ID = Guid.NewGuid();
model.PROJECT_ID = Guid.NewGuid();
model.Items = GetItems().ToList();
return View(model);
}
WhereGetItems
是一个返回具有三个完全填充的项目级视图模型的 IEnumerable 的方法。当我启动应用程序时,我看到一个正确填充的表格,其中包含 3 行,所有列都正确填充。
这是视图:
@using (Html.BeginForm("BoqReview", "Boq", FormMethod.Post))
{
<table class="table">
<tr>
<th>
</th>
<th class="col-header">
Item Code
</th>
<th class="col-header">
Item Description
</th>
<th>
Unit
</th>
<th>
Quantity
</th>
<th>
Rate
</th>
<th>
Amount
</th>
<th>
Item Pays
</th>
<th>
Item CPA
</th>
<th>
</th>
</tr>
@for (var i = 0; i < Model.Items.Count; i++)
{
<tr>
<td>
@Html.TextBoxFor(model => model.Items[i].BOQ_IMPORT_ID)
</td>
<td>
@Html.TextBoxFor(model => Model.Items[i].ITEM_CODE)
@Html.ValidationMessageFor(model => Model.Items[i].ITEM_CODE)
</td>
<td>
@Html.TextBoxFor(model => Model.Items[i].ITEM_DESC)
@Html.ValidationMessageFor(model => Model.Items[i].ITEM_DESC)
</td>
<td>
@Html.TextBoxFor(model => Model.Items[i].UNIT, new {style = "width: 120px;"})
@Html.ValidationMessageFor(model => Model.Items[i].UNIT)
</td>
<td>
@Html.TextBoxFor(model => Model.Items[i].QTY)
@Html.ValidationMessageFor(model => Model.Items[i].QTY)
</td>
<td>
@Html.TextBoxFor(model => Model.Items[i].RATE)
@Html.ValidationMessageFor(model => Model.Items[i].RATE)
</td>
<td>
@Html.TextBoxFor(model => Model.Items[i].AMOUNT)
@Html.ValidationMessageFor(model => Model.Items[i].AMOUNT)
</td>
<td>
@Html.DropDownListFor(model => Model.Items[i].ITEM_PAYS, Model.YesNoSelectList)
@Html.ValidationMessageFor(model => Model.Items[i].ITEM_PAYS)
</td>
<td>
@Html.DropDownListFor(model => Model.Items[i].ITEM_CPA, Model.YesNoSelectList)
@Html.ValidationMessageFor(model => Model.Items[i].ITEM_CPA)
</td>
<td>
@Html.CheckBoxFor(model => Model.Items[i].IsFlagged)
</td>
</tr>
}
<tr>
<td colspan="4">
<input type="submit" value="Submit" />
</td>
</tr>
</table>
}
一切看起来都很完美,但是当我提交表单时:
[HttpPost]
public ActionResult BoqReview(BoqReviewViewModel model)
{
using (var db = new AppDbContext())
{
foreach (var modelItem in model.Items)
{
var updated = modelItem.ToEntity();
db.GttBoqImports.AddOrUpdate(updated);
}
db.SaveChanges();
}
return RedirectToAction("BoqReview");
}
每个项目视图模型上的BOQ_IMPORT_ID
字段是一个空的 GUID,但显示的表格显示了一个正确的 GUID。项目级视图模型的所有其他属性仍然被填充。
只是这BOQ_IMPORT_ID
不是正确的模型绑定可能有什么问题?BOQ_IMPORT_ID
当我在 Chrome 工具中调试网络调用时,它会在发布的表单数据中显示正确的 GUID 值:
Items[0].BOQ_IMPORT_ID: 610d9a12-920f-43aa-89bc-08b68067a462
Items[0].ITEM_CODE: AA1
Items[0].ITEM_DESC: Some A's and a 1
Items[0].UNIT: kg
Items[0].QTY: 200
...
JUST IN:重命名该类和视图中的 VM 属性解决了整个问题。也许,尽管 VS 重新启动了几次,但机器重新启动可能会有所帮助。这有临时文件或某处缓存的味道。
解决方案
推荐阅读
- html - 使用 css 或 tailwind 更改按钮的颜色
- java - JList 在 Borderlayout 中隐藏了中心边框
- python - 线程安全问题
- c# - protoc-gen-grpc 文件名、目录名或卷标语法不正确
- python - 如何使用 yfinance 或任何其他模块过滤代码?
- java - 过滤多个条件 - reactor Flux/Mono filterWhen()
- javascript - 我想在选择下拉选项后自动调用 api
- node.js - 反应开发服务器未启动
- regex - 删除除 New Line 之外的所有额外空格 - Power Automate Desktop 中的 Regex
- kubernetes - 如何收集 Kubernetes 元数据?