Speichern Sie Rechnungsköpfe und Rechnungszeilen auf einem einseitigen Übermittlungsformular mit .NET Core Razor Pages
P粉298305266
P粉298305266 2024-03-29 20:07:24
0
1
465

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粉298305266
P粉298305266

Antworte allen(1)
P粉127901279

模型绑定通过名称属性绑定属性。与参数匹配的正确名称属性应类似于: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 属性,不确定您想做什么,但是我需要提醒您,这对于模型绑定没有任何意义。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage