在 Asp.Net Core 2.1.0 Razor 页面中创建批量记录

Create Bulk Records in Asp.Net Core 2.1.0 Razor Page

我想通过执行以下操作来更新默认方案以一次插入多条记录。

  1. On Form Submit,数据被提交到List/Table并显示在同一页面上。可能正在使用 Ajax 或服务器端。

  2. 在最终提交时 post,将所有记录插入数据库。

我的实体

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");
    }

这是 Razor 页面

<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>

这里一切都适用于将单条记录插入数据库。

请建议我实现此目标的方法。

没有任何直接的方法。

您可以使用将整个对象存储在客户端的库。即 Knockout JS 或 Angular JS

最后post所有数据到服务器端

 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();
}

我找到了使用 SessionList<T> 的解决方案。

  1. 再添加一个 Input 按钮来处理要存储在 Sessionasp-page-handler="AddtoList"

  2. 中的数据
  3. 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. 所以您的列表可以在 .cshtmlSession 中找到。重复它直到你的列表完成。
  2. 在最终提交时,将您的会话列表加载到 List<T> 并进行数据库保存或任何您想要的操作。

注意:以下是在 Asp.Net Core

中工作的会话代码

Startup.csConfiguration方法中,

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

并且在Configure方法中,在app.UseMvc();

之前添加app.UseSession();