Одно поле в размещенном массиве не привязано к модели - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть следующие, сокращенные для ясности и конфиденциальности, модели представления:

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, перезапуск машины могучим как-то помог. Это пахнет временными файлами или чем-то вроде кеширования.

...