在 Asp.Net Core 2.1.0 Razor 页面中创建批量记录
Create Bulk Records in Asp.Net Core 2.1.0 Razor Page
我想通过执行以下操作来更新默认方案以一次插入多条记录。
On Form Submit,数据被提交到List/Table并显示在同一页面上。可能正在使用 Ajax 或服务器端。
在最终提交时 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();
}
我找到了使用 Session
和 List<T>
的解决方案。
再添加一个 Input
按钮来处理要存储在 Session
和 asp-page-handler="AddtoList"
中的数据
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();
- 所以您的列表可以在
.cshtml
和 Session
中找到。重复它直到你的列表完成。
- 在最终提交时,将您的会话列表加载到
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.UseMvc();
之前添加app.UseSession();
我想通过执行以下操作来更新默认方案以一次插入多条记录。
On Form Submit,数据被提交到List/Table并显示在同一页面上。可能正在使用 Ajax 或服务器端。
在最终提交时 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();
}
我找到了使用 Session
和 List<T>
的解决方案。
再添加一个
Input
按钮来处理要存储在Session
和asp-page-handler="AddtoList"
中的数据
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();
- 所以您的列表可以在
.cshtml
和Session
中找到。重复它直到你的列表完成。 - 在最终提交时,将您的会话列表加载到
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.UseMvc();
app.UseSession();