【问题标题】:Create Bulk Records in Asp.Net Core 2.1.0 Razor Page在 Asp.Net Core 2.1.0 Razor 页面中创建批量记录
【发布时间】:2019-01-21 03:39:27
【问题描述】:

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

  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>

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

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

【问题讨论】:

  • 或者您可以创建 HTML 表格(带有动态行),从用户那里获取数据并将所有数据保存在表单发布中。
  • 是的,有可能。您可以发布示例或此类参考链接吗?
  • 类似this

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


【解决方案1】:

没有任何直接的方法。

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

在上一篇文章中将所有数据发送到服务器端

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

【讨论】:

  • 您能否提供示例以在 JQuery 中将整个对象存储在客户端。
  • @Ramesh 希望对您有所帮助forum.jquery.com/topic/…
  • 不知何故我设法动态地制作我的 html 表。但 ajax 发布不适用于 url:'Create'。我正在使用剃刀页面。有没有其他方法。
  • 我试过 'Create'、'/Create'、'Create?Handler=handler' 但没有成功。
【解决方案2】:

我找到了使用SessionList&lt;T&gt; 的解决方案。

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

  2. OnPostAddtoList 方法,将已经存在的会话数据加载到List&lt;T&gt; 并将新记录附加到其中并保存到会话。

这里是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&lt;T&gt; 并进行数据库保存或任何您想要的操作。

注意:以下是在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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-27
    • 2019-10-13
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2018-02-24
    • 2021-10-27
    相关资源
    最近更新 更多