在Razor页面中调用动作

17 浏览
0 Comments

在Razor页面中调用动作

作为一个Razor Pages的新手,我有一个关于从Razor Page调用方法的问题。

  • 方法SubtractProduct()在我的领域模型中定义。
  • 索引页面有IActionResult sellProduct()方法,它调用subtractProduct()方法来指定ProductId。

但是我不知道如何在我的html页面中调用这个方法。

我尝试了很多组合,但似乎没有什么作用。有人知道如何处理这个问题吗?

非常感谢任何帮助!

我的领域模型是:

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

我的索引页面代码是:

public class IndexModel : PageModel
{
    private readonly CfEshop.Data.ApplicationDbContext _context;
    public IndexModel(CfEshop.Data.ApplicationDbContext context)
    {
        _context = context;
    }
    public IList 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();
    }
}

最后是我的Razor页面:

@page

@model CfEshop.Pages.Product.IndexModel

Index

@foreach (var item in Model.Product)

{

}

@Html.DisplayNameFor(model => model.Product[0].Quantity)

@Html.DisplayFor(modelItem => item.Quantity)

Sell Product

0
0 Comments

在Razor Pages中调用Action时,需要解析url,为了解决这个问题,可以添加如下的tagHelper和asp-action属性。

*, Microsoft.AspNetCore.Mvc.TagHelpers

这样就可以在Razor Pages中调用Action了。

0
0 Comments

在Razor Pages中,有一种叫做"handler-methods"的HTTP动词。因此,要从页面调用一个方法,需要在方法名前面加上"On",然后是所需的HTTP动词。

为了解决这个问题,您需要在视图中将名称传递给"asp-page-handler",但不需要加上"OnPost"或"OnGet"前缀,也不需要加上"Async"后缀。

然而,在修改视图后,我遇到了一个错误。错误消息为"InvalidOperationException: Cannot determine the 'href' attribute for ". The following attributes are mutually exclusive: asp-route asp-controller, asp-action asp-page, asp-page-handler Microsoft.AspNetCore.Mvc.TagHelpers.AnchorTagHelper.Process(TagHelperContext context, TagHelperOutput output)"。

解决方法是,您的""标签应该像这样:

Sell Product

您需要添加"asp-route-id"来匹配您的操作中的参数"id"。

另外,您可以使用"return RedirectToPage();"返回当前页面,通常通过提交表单来更改数据库或值。

希望这些解决方法对您有所帮助!

0