suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Speichern Sie Rechnungsköpfe und Rechnungszeilen auf einem einseitigen Übermittlungsformular mit .NET Core Razor Pages

1.Anleitung

Ich möchte die Seite „Erstellen“ öffnen, die Rechnungskopfdaten und die dynamischen Zeilendaten der Rechnung eingeben und alles in einer Übermittlung speichern.

(* aktualisierter Code) Ich habe es geschafft, den RowList-Fehler zu beheben, der es mir nicht erlaubte, mehrere Zeilen hinzuzufügen:

So verwenden Sie AddRange, um mehrere Zeilen in die ASP.NET Core Razor-Seite einzufügen

Jetzt bekomme ich den Fehler

1.1 Fehler

ArgumentNullException: Der Wert darf nicht null sein. (Parameter „Quelle“)

System.Linq.ThrowHelper.ThrowArgumentNullException(ExceptionArgument-Parameter)

ArgumentNullException: Der Wert darf nicht null sein. (Parameter „Quelle“)

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-Kontext, TagHelperOutput-Ausgabe) Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner.g__Awaited|0_0(task task, TagHelperExecutionContextexecutionContext, int i, int count) EPIDENT5.Pages.Magazina.Pages_Magazina_Create.ExecuteAsync() in Create.cshtml

ViewData["Title"] = "Create";

Ich weiß, dass mir etwas fehlt, aber ich verstehe nicht, wo das Problem liegt.

2. Frage

Wie geht das?

<强>3. Front-End-Code:

<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. Backend-Code

//Datenbindungsteil

[BindProperty]
    public InvHeader InvHeader { get; set; } = default!;
    public IList<InvRow> RowList { get; set; }

//onget-Methode, wobei die Zeilenanzahl rot ist

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-Methode

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粉298305266283 Tage vor473

Antworte allen(1)Ich werde antworten

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

    Antwort
    0
  • StornierenAntwort