在Asp.Net Core 2.1.0剃刀页中创建批量记录

时间:2018-08-14 09:57:07

标签: c# razor-pages asp.net-core-2.1

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

  1. 在“表单提交”上,要提交到列表/表并显示在同一页面上的数据。可能正在使用Ajax或服务器端。

  2. 在“最终提交”帖子上,将所有记录插入数据库。

我的实体

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>

这里一切都可以将单个记录插入数据库。

请向我建议实现这一目标的方法。

2 个答案:

答案 0 :(得分:0)

没有任何直接的方法。

您可以使用将整个对象存储在客户端的库。即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();
}

答案 1 :(得分:0)

我找到了使用SessionList<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. 因此,您的列表在.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.UseSession();之前添加app.UseMvc();