1.说明
我想打开“创建”页面,填写发票抬头数据,填写发票动态行数据并将所有内容保存在一次提交中。
(* 更新代码) 我设法解决了 RowList 错误,该错误不允许我添加多行:
如何在 ASP.NET Core Razor 页面中使用 AddRange 插入多行
现在我收到错误
1.1 错误
ArgumentNullException:值不能为空。 (参数“来源”)
System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument 参数)
ArgumentNullException:值不能为空。 (参数“来源”)
System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument) System.Linq.Enumerable.Count<TSource>(IEnumerable<TSource> source) EPIDENT5.Pages.Magazina.Pages_Magazina_Create.<ExecuteAsync>b__28_0() in Create.cshtml
...
@for (int i = 0; i < Model.RowList.Count(); i++)
Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperExecutionContext.GetChildContentAsync(bool useCachedResult,HtmlEncoder编码器) Microsoft.AspNetCore.Mvc.TagHelpers.RenderAtEndOfFormTagHelper.ProcessAsync(TagHelperContext 上下文,TagHelperOutput 输出) Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner.g__Awaited|0_0(任务任务,TagHelperExecutionContextexecutionContext,int i,int count) Create.cshtml 中的 EPIDENT5.Pages.Magazina.Pages_Magazina_Create.ExecuteAsync()
ViewData["Title"] = "Create";
我知道我错过了一些东西,但不明白问题出在哪里。
2.问题
如何做到这一点?
<强>3。前端代码:
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
// This is the header table
<table class="table table-striped border-0"
style="width: 100%; text-align: left;">
<thead class="border-0">
<tr class="border-0">
<td class="border-0" style="min-width:100%;">
<div class="border border-secondary p-4">
<div class="row ">
<div style="float:left;width:50%;">
<div class="form-group m-1">
<label asp-for="InvHeader.Cli" class="control-label" style="font-size:80%;">Client</label>
<input asp-for="InvHeader.Cli" class="form-control" value="clients name" />
</div>
</div>
<div style="float:left;width:25%;">
<div class="form-group m-1">
<input asp-for="InvHeader.InvDate" class="form-control" type="date" value="@(DateTime.UtcNow.Date.ToString("yyyy-MM-dd"))" />
<span asp-validation-for="InvHeader.InvDate" class="text-danger"></span>
</div>
</div>
<div style="float:left;width:25%;">
<div class="form-group m-1">
<input asp-for="InvHeader.InvNr" class="form-control" value="33" />
<span asp-validation-for="InvHeader.InvNr" class="text-danger"></span>
</div>
</div>
</div>
</div>
</td>
</tr>
</thead>
</table>
//This is the dynamic rows table
<table id="table1" border="0">
<tr style="font-size:80%;">
<th style="width:50%;">Product</th>
<th style="width:5%;">qty</th>
<th style="width:5%;">price</th>
</tr>
foreach (var item in Model.PL)
{
<tr class="border-bottom">
<td>
<select id="Products" asp-for="@Model.PL[@i].ProdId" class="form-control" type="text" name="data[@i][ProdId]" style="width:100%;" >
@foreach (var item in Model.PL)
{
<option value="@item.ProdId"
qty="@qty"
price="@Convert.ToInt32(item.price)">@item.name, @Convert.ToInt32(item.price)</option>
}
</select>
</td>
<td><input asp-for="@Model.MR[@i].qty" class="form-control" type="text" name="qty[@i]" style="width:100%;" /></td>
<td><input asp-for="@Model.MR[@i].price" class="form-control" type="text" name="price[@i]" style="width:100%;" /></td>
</tr>
</table>
</form>
4.后端代码
//数据绑定部分
[BindProperty]
public InvHeader InvHeader { get; set; } = default!;
public IList<InvRow> RowList { get; set; }
//onget方法,其中row count id red
public IActionResult OnGetAsync()
{
var rr = new List<InvRow>()
{
new InvRow() { Name = "Apple", Qty = 5, Price = 100 },
new InvRow() { Name = "Peach", Qty = 3, Price = 500 },
new InvRow() { Name = "Ananas", Qty = 1, Price = 1100 },
};
RowList = rr;
return Page();
}
//Onpost方法
public async Task<IActionResult> OnPostAsync(IList<InvRow> RowList)
{
if (!ModelState.IsValid)
{
return Page();
}
_context.InvHeaders.Add(InvHeader);
await _context.InvRows.AddRangeAsync(RowList);
await _context.SaveChangesAsync();
return RedirectToPage("./Index");
} Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
模型绑定通过名称属性绑定属性。与参数匹配的正确名称属性应类似于:
addrows[index].propertyName。不确定页面中的
PL是什么,但似乎只有qty和price输入与InvRows 相关模型。您需要更改两个输入名称,如下所示:如果 select 元素也与
InvRows模型相关,只需更改 select 名称,例如:addrows[@i].ProdId。无论如何,名称取决于您的模型。此外,您的页面包含重复的同名 foreach,这是不正确的。假设应该是:
您可以遵循的完整工作演示:
型号
public class InvHeaders { public int CliId { get; set; } public DateTime InvDate { get; set; } public string InvNr { get; set; } } public class InvRows { public int qty { get; set; } public int price { get; set; } } public class Product { public int ProdId { get; set; } public string name { get; set; } public int price { get; set; } }页面
页面模型
public class IndexModel : PageModel { [BindProperty] public InvHeaders InvHeader { get; set; } = default!; [BindProperty] public InvRows InvRow { get; set; } = default!; public IList MR { get; set; } = default!;
public List PL { get; set; }
public void OnGet()
{
//hard-coded the value is just for easy testing
PL = new List()
{
new Product(){ProdId=1,name="aa",price=12},
new Product(){ProdId=2,name="bb",price=16},
new Product(){ProdId=3,name="cc",price=21}
};
}
public void OnPost(List addrows)
{
//do your stuff....
}
} 请注意,下面的默认
option元素中没有qty或price属性,不确定您想做什么,但是我需要提醒您,这对于模型绑定没有任何意义。