Создание массовых записей на странице Asp.Net Core 2.1.0 Razor

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

  1. При отправке формы данные должны быть отправлены в список/таблицу и отображаться на той же странице. Может быть с использованием Ajax или на стороне сервера.

  2. В сообщении Final Submit вставьте все записи в БД.

Моя сущность

public class ItemAttribute
{
    [Key]
    public int ID { get; set; }
    public int ItemID { get; set; }
    public string UoM { get; set; }
    public decimal SaleVal { get; set; }

    [ForeignKey("ItemID")]
    public Item Item { get; set; }
}

Моя модель создания

private readonly Test3.Models.Test3Context _context;
    public CreateModel(Test3.Models.Test3Context context)
    { _context = context; }

    public IActionResult OnGet()
    {
        ViewData["ItemID"] = new SelectList(_context.Item, "ItemID", "ItemID");
        return Page();
    }

    [BindProperty]
    public ItemAttribute ItemAttribute { get; set; }

    public async Task<IActionResult> OnPostAsync()
    {
        _context.ItemAttribute.Add(ItemAttribute);
        await _context.SaveChangesAsync();

        return RedirectToPage("./Index");
    }

Вот страница бритвы

<form method="post">
        <div asp-validation-summary="ModelOnly" class="text-danger"></div>
        <div class="form-group">
            <label asp-for="ItemAttribute.ItemID" class="control-label"></label>
            <select asp-for="ItemAttribute.ItemID" class ="form-control" asp-items="ViewBag.ItemID"></select>
        </div>
        <div class="form-group">
            <label asp-for="ItemAttribute.UoM" class="control-label"></label>
            <input asp-for="ItemAttribute.UoM" class="form-control" />
            <span asp-validation-for="ItemAttribute.UoM" class="text-danger"></span>
        </div>
        <div class="form-group">
            <label asp-for="ItemAttribute.SaleVal" class="control-label"></label>
            <input asp-for="ItemAttribute.SaleVal" class="form-control" />
            <span asp-validation-for="ItemAttribute.SaleVal" class="text-danger"></span>
        </div>
        <div class="form-group">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </form>

Здесь все работает для вставки одиночной записи в БД.

Пожалуйста, предложите мне способ добиться этого.


person Ramesh    schedule 14.08.2018    source источник
comment
ИЛИ вы можете создать таблицу HTML (с динамическими строками), получить данные от пользователя и сохранить все данные в сообщении формы.   -  person Divyang Desai    schedule 14.08.2018
comment
Да, это возможно. Можете ли вы опубликовать образец или такие справочные ссылки.   -  person Ramesh    schedule 14.08.2018
comment
Что-то вроде этого   -  person Divyang Desai    schedule 14.08.2018


Ответы (2)


Прямого пути как такового нет.

Вы можете использовать библиотеку, которая будет хранить весь объект на стороне клиента. т. е. Knockout JS или Angular JS

а в последнем посте все данные на сервер

 var data = JSON.stringify({ 'values': values});

    $.ajax({
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        type: 'POST',
        url: 'yourURL',
        data: data,
        success: function () {          
            $('#result').html('successfully called.');
        },
        failure: function (response) {          
            $('#result').html(response);
        }
    }); 

и в контроллере:

public async Task<IActionResult> saveData(List<ItemAttribute> data)
{
        foreach(var item in data)
        {
          _context.ItemAttribute.Add(item);
        }
        await _context.SaveChangesAsync();
}
person Hossein    schedule 14.08.2018
comment
Можете ли вы предоставить образец для хранения всего объекта на стороне клиента в JQuery. - person Ramesh; 14.08.2018
comment
@Ramesh Надеюсь, это поможет вам forum.jquery .com/topic/ - person Hossein; 14.08.2018
comment
Каким-то образом мне удалось сделать мою html-таблицу динамически. но публикация ajax не работает с URL: «Создать». Я использую Razor Page. Есть ли другой способ для этого. - person Ramesh; 14.08.2018
comment
Я пробовал «Создать», «/ Создать», «Создать? Обработчик = обработчик», но безуспешно. - person Ramesh; 15.08.2018

Я нашел решение, используя Session и List<T>.

  1. Добавьте еще одну кнопку Input для обработки данных, которые нужно сохранить в Session с помощью asp-page-handler="AddtoList".

  2. OnPostAddtoList, загрузить уже существующие данные сеанса в List<T> и добавить к нему новую запись и сохранить обратно в сеанс.

Вот OnPostAddtoList()

        var key = "ItemList";
        List<ItemAttribute> TempList = new List<ItemAttribute>();

        var value = HttpContext.Session.GetString(key);
        if (value != null)
        { TempList = JsonConvert.DeserializeObject<List<ItemAttribute>>(value); }

        var ItemAttribute1 = new ItemAttribute { UoM = ItemAttribute.UoM, SaleVal = ItemAttribute.SaleVal};
        TempList.Add(ItemAttribute1);

        ItemAttributeList = TempList;

        HttpContext.Session.SetString(key, JsonConvert.SerializeObject(ItemAttributeList));

        return Page();
  1. Итак, ваш список доступен .cshtml и Session. Повторяйте это, пока ваш список не завершится.
  2. При окончательной отправке загрузите список сеансов в List<T> и выполните сохранение БД или что хотите.

Примечание. Ниже приведен код сеанса для работы в Asp.Net Core.

В методе Startup.cs, Configuration,

services.AddDistributedMemoryCache();
        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromMinutes(30);
            options.Cookie.HttpOnly = true;
        });

И в методе Configure добавьте app.UseSession(); перед app.UseMvc();

person Ramesh    schedule 15.08.2018