在Razor页面中调用动作
在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 IListProduct { 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
@Html.DisplayNameFor(model => model.Product[0].Quantity) |
|
---|---|
@Html.DisplayFor(modelItem => item.Quantity) |
在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();"返回当前页面,通常通过提交表单来更改数据库或值。
希望这些解决方法对您有所帮助!