У меня есть следующие, сокращенные для ясности и конфиденциальности, модели представления:
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);
}
Где GetItems
- это метод, который возвращает 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
не связан с моделью? Когда я отлаживаю сетевой вызов в инструментах Chrome, он показывает правильное значение GUID для каждого BOQ_IMPORT_ID
в отправленных данных формы:
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
...
ПРОСТО IN: Переименование свойства VM в этом классе и в представлении решило всю проблему. Возможно, несмотря на несколько перезапусков VS, перезапуск машины могучим как-то помог. Это пахнет временными файлами или чем-то вроде кеширования.