Enregistrez les en-têtes et les lignes de facture sur un formulaire de soumission d'une seule page à l'aide de .NET Core Razor Pages
P粉298305266
P粉298305266 2024-03-29 20:07:24
0
1
442

1.Instructions

Je souhaite ouvrir la page "Créer", renseigner les données d'en-tête de la facture, renseigner les données de la ligne dynamique de la facture et tout enregistrer en une seule soumission.

(* code mis à jour) J'ai réussi à résoudre l'erreur RowList qui ne me permettait pas d'ajouter plusieurs lignes :

Comment utiliser AddRange pour insérer plusieurs lignes dans la page ASP.NET Core Razor

Maintenant, j'obtiens l'erreur

Erreur 1.1

ArgumentNullException : la valeur ne peut pas être nulle. (paramètre "source")

System.Linq.ThrowHelper.ThrowArgumentNullException (paramètre ExceptionArgument)

ArgumentNullException : la valeur ne peut pas être nulle. (paramètre "source")

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, encodeur HtmlEncoder) Microsoft.AspNetCore.Mvc.TagHelpers.RenderAtEndOfFormTagHelper.ProcessAsync (contexte TagHelperContext, sortie TagHelperOutput) Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner.g__Awaited|0_0 (tâche, TagHelperExecutionContextexecutionContext, int i, nombre int) EPIDENT5.Pages.Magazina.Pages_Magazina_Create.ExecuteAsync() dans Create.cshtml

ViewData["Title"] = "Create";

Je sais qu'il me manque quelque chose mais je ne comprends pas quel est le problème.

2.Question

Comment faire ça ?

<强>3. Code frontal :

<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. Code back-end

//Partie de liaison de données

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

//méthode onget, où le nombre de lignes est rouge

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

//Méthode 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粉298305266
P粉298305266

répondre à tous(1)
P粉127901279

La liaison de modèle lie les propriétés via l'attribut name. L'attribut de nom correct correspondant au paramètre devrait ressembler à : addrows[index].propertyName.

Inputs liés à PL 是什么,但似乎只有 qtypriceInvRows dans le modèle de page indéterminé. Vous devez modifier les deux noms d'entrée comme suit :


Si l'élément select est également lié au modèle InvRows 模型相关,只需更改 select 名称,例如:addrows[@i].ProdIdInvRows, changez simplement le nom de sélection, par exemple :

addrows[@i].ProdId. Quoi qu'il en soit, le nom dépend de votre modèle.

De plus, votre page contient un foreach en double avec le même nom, ce qui est incorrect. L'hypothèse devrait être :

@for(int i = 0;i
    
        
    
    
    

}
Démo fonctionnelle complète que vous pouvez suivre :

Modèle

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

@page
@model IndexModel

@for(int i = 0;i }
Product qty price
Maquette de page
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 元素中没有 qtypriceVeuillez noter qu'il n'y a pas d'attributs

qty ou 🎜price dans l'élément 🎜option par défaut ci-dessous, je ne suis pas sûr de ce que vous voulez faire, mais je dois vous rappeler que c'est le cas. ne fonctionne pas pour la liaison de modèle. 🎜
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal