Как разместить данные строк таблицы на контроллере без использования ajax в ядре asp.net - PullRequest
0 голосов
/ 05 июня 2018

Чего нужно достичь, так это того, что у меня есть форма для добавления строк с данными в html-таблицу, это как временная таблица, и все данные из нее будут добавлены всего лишь одной кнопкой отправки.Как я могу это сделать?

Это моя примерная структура таблицы, данные из нее должны быть добавлены в db

<form asp-action="Create">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
    <table class="table">
        <thead>
            <tr>
                <!--some other fields-->
                <th>Amount</th>
                <th>Check #</th>
                <th>Check Date</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <!--some other fields-->
                <td>
                    <input asp-for="Amount" class="form-control" />
                    <span asp-validation-for="Amount" class="text-danger"></span>
                </td>
                <td>
                    <input asp-for="Check_No" class="form-control" />
                    <span asp-validation-for="Check_No" class="text-danger"></span>
                </td>
                <td>
                    <input asp-for="Check_Date" class="form-control" />
                    <span asp-validation-for="Check_Date" class="text-danger"></span>
                </td>
            </tr>
            <!--row 2-->
            <!--row 3-->
            <!--row 4-->
            <!--etc..-->
        </tbody>
    </table>
</div>
<div class="form-group">
    <input type="submit" value="Create" class="btn btn-default" />
</div>

А вот мой код контроллера такдалеко, я не знаю, что мне нужно изменить

// POST: Books/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Create([Bind("Id,Year,Month,Document_Code,GLA_Code,Expense_Code,Function_Code,Document_Reference_No,Document_Date,Quantity,Amount,Check_No,Check_Date,Remarks,Encoder")] Book book)
    {
        if (ModelState.IsValid)
        {
            _context.Add(book);
            await _context.SaveChangesAsync();
            return RedirectToAction(nameof(Index));
        }
        return View(book);
    }

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

Спасибо.

1 Ответ

0 голосов
/ 05 июня 2018

Здесь есть несколько проблем.

Во-первых, если у вас есть таблица "books" (множественное число), входные имена должны быть проиндексированы.Затем вам также нужно принять что-то вроде List<Book> вместо Book в качестве параметра вашего метода действия.Трудно сказать с помощью только предоставленного кода, но я думаю, что вы повторяете эти входные данные, все с одинаковыми именами для каждой строки.В этом случае будут опубликованы только значения для последнего элемента.Составив список элементов, вы сможете опубликовать их все.

Упрощенно, это означает, что ваши входные данные должны иметь имена вроде [0].Amount, которые Razor сгенерирует для вас, если вы используете цикл for и рендервходные данные, такие как:

<input asp-for="@Model[i].Amount" class="form-control" />

Если вы добавляете дополнительные строки (и содержат входные данные) через JavaScript, вам необходимо убедиться, что вы сами генерируете эти проиндексированные имена.В этом отношении может помочь библиотека шаблонов JS.

Во-вторых, не использовать Bind.Просто не надо.Это ужасно, ужасно и убивает как щенков, так и котят.Для более подробного объяснения см. Мой пост Bind is Evil .Вместо этого используйте модель представления.Как правило, вы должны никогда публиковать класс сущностей.Ваши классы сущностей обслуживают базу данных и ее задачи, которые почти всегда отличаются от задач представления.Кроме того, вы должны никогда просто слепо сохранять что-то, опубликованное пользователем.Даже если вы настаиваете на использовании вашего класса сущностей для привязки, вы можете экспоненциально улучшить защиту и безопасность своего кода, буквально сопоставляя значения из опубликованной версии класса с новым экземпляром, который вы создаете.Затем вы знаете в точности , что сохраняется в базе данных (без богом забытого Bind), и у вас также есть возможность санировать ввод при необходимости.

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