Rumah > Soal Jawab > teks badan
1.Arahan
Saya ingin membuka halaman "Buat", mengisi data pengepala invois, mengisi data baris dinamik invois dan menyimpan semuanya dalam satu penyerahan.
(* kod dikemas kini) Saya berjaya menyelesaikan ralat RowList yang tidak membenarkan saya menambah berbilang baris:
Cara menggunakan AddRange untuk memasukkan berbilang baris dalam halaman ASP.NET Core Razor
Sekarang saya mendapat ralat
1.1 Ralat
ArgumentNullException: Nilai tidak boleh batal. (parameter "sumber")
System.Linq.ThrowHelper.ThrowArgumentNullException(ParameterExceptionArgument)
ArgumentNullException: Nilai tidak boleh batal. (parameter "sumber")
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 encoder) Microsoft.AspNetCore.Mvc.TagHelpers.RenderAtEndOfFormTagHelper.ProcessAsync(TagHelperContext context, TagHelperOutput output) Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner.g__Awaited|0_0(tugas tugas, TagHelperExecutionContextexecutionContext, int i, int count) EPIDENT5.Pages.Magazina.Pages_Magazina_Create.ExecuteAsync() dalam Create.cshtml
ViewData["Title"] = "Create";
Saya tahu saya kehilangan sesuatu tetapi tidak faham apa masalahnya.
2 Bagaimana untuk melakukan ini?
3. Kod bahagian hadapan:<强>
<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. Kod hujung belakang
//Bahagian mengikat data
[BindProperty] public InvHeader InvHeader { get; set; } = default!; public IList<InvRow> RowList { get; set; }
// kaedah onget, di mana id kiraan baris merah
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(); }
// Kaedah 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"); }
P粉1279012792024-03-30 17:33:35
Pengikatan model mengikat sifat melalui atribut nama. Atribut nama yang betul sepadan dengan parameter sepatutnya kelihatan seperti: addrows[index].propertyName
.
Input yang berkaitan dengan PL
是什么,但似乎只有 qty
和 price
InvRows dalam model halaman tak tentu. Anda perlu menukar kedua-dua nama input seperti berikut:
Jika elemen pilih juga berkaitan dengan model InvRows
模型相关,只需更改 select 名称,例如:addrows[@i].ProdId
InvRows, cuma tukar nama pilih, contohnya:
Selain itu, halaman anda mengandungi pendua foreach dengan nama yang sama, yang tidak betul. Hipotesis sepatutnya:
@for(int i = 0;iDemo kerja penuh anda boleh ikuti:}
Model
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; } }Halaman
@page @model IndexModelMockup halaman
public class IndexModel : PageModel { [BindProperty] public InvHeaders InvHeader { get; set; } = default!; [BindProperty] public InvRows InvRow { get; set; } = default!; public IListMR { 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
Sila ambil perhatian bahawa tiada atribut