web-dev-qa-db-fra.com

Appel à l'action dans les pages de rasoir

en tant que débutant sur Razor Pages, j'ai une question concernant les méthodes d'appel depuis Razor Page.

J'ai une méthode appelée subtractProduct définie dans mon modèle de domaine.

Dans mon code de page d'index, je définis IActionResult sellProduct qui appelle subtractProduct sur ProductId spécifié. Mais je ne sais pas comment appeler cette méthode sur ma page html. J'ai essayé beaucoup de combinaisons, mais rien ne semble fonctionner. Quelqu'un sait comment gérer cela? Toute aide est grandement appréciée!

Mon modèle de domaine est:

public class Product

{
    public int ProductId { get; set; }
    public int Quantity { get; set; }   
    ...
    public void SubtractProduct()
    {
        Quantity -= 1;
    }
}

Le code de ma page d'index est:

public class IndexModel : PageModel
{
    private readonly CfEshop.Data.ApplicationDbContext _context;

    public IndexModel(CfEshop.Data.ApplicationDbContext context)
    {
        _context = context;
    }

    public IList<Models.Product> Product { get;set; }

    public async Task OnGetAsync()
    {
        Product = await _context.Products
            .Include(p => p.Categories).ToListAsync();
    }

    public IActionResult sellProduct(int id)
    {
        var products = _context.Products;

        _context.Products.Find(id).SubtractProduct();
        return Page();
    }
}

Et enfin ma page Razor:

@page
@model CfEshop.Pages.Product.IndexModel
<h2>Index</h2>

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Product[0].Quantity)
            </th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.Product)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Quantity)
                </td>
                <td>
                    <a asp-page-handler="SellProduct" asp-route="@item.ProductId">Sell Product</a>
                </td>
            </tr>
        }
    </tbody>
</table>
4
xcelm

Les pages de rasoir ont handler-methods qui sont des verbes HTTP. Donc, pour appeler une méthode depuis votre page, vous devez mettre On suivi de the http verb you want puis votre method name.

Par exemple.:

public IActionResult OnGetSellProduct(int id)
{
    var products = _context.Products;

    _context.Products.Find(id).SubtractProduct();
    return Page();
}

Et selon vous, passez le nom au asp-page-handler sans le OnPost or OnGet préfixe ou Async suffixe.

Edit: voici l'exemple de vue:

<a asp-page-handler="SellProduct" asp-route-id="@item.ProductId">Sell Product</a>

Pour plus d'informations, consultez ceux-ci:

Introduction aux pages Razor .

Méthodes de gestion des pages de rasoir .

3
Hameed