Представление публикует пустой объект при отправке, ожидая, что измененный объект - PullRequest
1 голос
/ 13 мая 2019

У меня есть представление, которое позволяет пользователям редактировать данные, которые извлекаются из базы данных и преобразуются в DataTable (для простоты, поскольку данные могут быть действительно сложными и глубокими). ​​

Проблема в том, что когда я отправляю данные обратно ответственному контроллеру, контроллер получает объект DataTable, но он пуст, например, внесенные пользователем изменения никогда не возвращаются в контроллер и не могут быть сохранены в базе данных.

Я не более среднего уровня в веб-программировании, поэтому я ценю прямые ответы или прямые указатели.

Вид:

@model System.Data.DataTable
@{
    ViewData["Title"] = "Edit";
    Layout = "~/Views/Shared/_LayoutAdminlte.cshtml";
}


@using (Html.BeginForm("EditSave", "Recipe", FormMethod.Post, new { @id = "Properties-Form" }))
{
    @Html.AntiForgeryToken()
    <div class="form-horizontal">
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            <h2>@Html.DisplayFor(m => Model.TableName)</h2>

        </div>
        <div class="box box-primary">
            <table id="Properties" class="table table-condensed">
                <thead>
                    <tr>
                        @foreach (System.Data.DataColumn col in Model.Columns)
                        {
                            <th>
                                @Html.DisplayFor(m => col.Caption)
                            </th>
                        }
                    </tr>
                </thead>
                <tbody>
                    @foreach (System.Data.DataRow row in Model.Rows)
                    {
                        <tr>
                            @foreach (var cell in row.ItemArray)
                            {
                                <td>
                                    @if (row.ItemArray.ToList().IndexOf(cell) == 0)
                                    {
                                        @cell.ToString()
                                    }
                                    else
                                    {
                                        <input asp-for="@cell" />
                                    }

                                </td>
                            }
                        </tr>
                    }
                </tbody>
            </table>
        </div>
        <div class="box-footer">
            <!--  id="Save" -->
            <input class="btn btn-primary pull-right" type="submit" value="Spara" id="Save" />
            <a href="/Recipe/detail/@Model.TableName" class="btn btn-default"><i class="fa fa-show"></i> Visa</a>
            <a href="/Recipe/Edit/@Model.TableName" class="btn btn-primary"><i class="fa fa-show"></i> Avbryt</a>
        </div>
    </div>
}


@section Scripts{
    @await Html.PartialAsync("_ValidationScriptsPartial")

}

Контроллер:

        [HttpPost]
        public ActionResult EditSave(DataTable model)
        {
            Debugger.Break();

            return View("Edit", model);
        }

1 Ответ

0 голосов
/ 13 мая 2019

Это <input asp-for="@cell" /> ваша проблема.

Если вы запустите свою программу и используете инструменты разработчика для проверки html, сгенерированного для полей ввода, вы заметите сгенерированные html атрибуты.

особое внимание, на которое следует обратить внимание, это атрибут name.

Способ привязки модели работает в .net core при отправке данных на контроллер.

public IActionResult DoSomething(Model model) { ... }

у вас будет совпадение атрибута имени со свойством объекта. Пример:

<input name="model.Level" value="8999" />

тогда вы получите var level = model.Level и level будет 8999.

Таким образом, вы должны позаботиться о том, чтобы использовать asp-for, это не делает так много тяжелой работы, как вы думаете. Всегда проверяйте сгенерированный html.

PS

Не используйте DataTables, другие разработчики будут бросать камни в вас. Не ленитесь привязываться к реальному объекту или использовать ORM, программы быстро становятся неуправляемыми, если вы используете их для динамического хранения данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...