搜索

首页  >  问答  >  正文

使用 .NET Core Razor 页面在单页提交表单上保存发票标题和发票行

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

P粉298305266P粉298305266238 天前440

全部回复(1)我来回复

  • P粉127901279

    P粉1279012792024-03-30 17:33:35

    模型绑定通过名称属性绑定属性。与参数匹配的正确名称属性应类似于:addrows[index].propertyName

    不确定页面中的 PL 是什么,但似乎只有 qtyprice 输入与 InvRows 相关模型。您需要更改两个输入名称,如下所示:

    
    

    如果 select 元素也与 InvRows 模型相关,只需更改 select 名称,例如:addrows[@i].ProdId。无论如何,名称取决于您的模型。

    此外,您的页面包含重复的同名 foreach,这是不正确的。假设应该是:

    @for(int i = 0;i
        
            
        
        
        
    
    }

    您可以遵循的完整工作演示:

    型号

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

    页面

    @page
    @model IndexModel
    
    
    @for(int i = 0;i }
    Product qty price

    页面模型

    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 元素中没有 qtyprice 属性,不确定您想做什么,但是我需要提醒您,这对于模型绑定没有任何意义。

    回复
    0
  • 取消回复