我正在开发 Blazor 服务器项目,由于我是这项技术的新手,我面临着一个我无法理解的问题。
简而言之,我有一个小公式可以将对象添加到我的 postgresDB 中。我的 page.cshtml 中存在的这个公式应该触发文件 Page.cshtml.cs 中的 OnPostAddAsync() 方法。
事实证明,这个方法永远不会被触发。我很迷茫,我什至无法解释更多我的问题,因为我感觉我已经检查了网络上有关此问题的所有教程。
我希望你能让我重回正轨。
这是我的 page.cshtml 的一部分
@page "/"
@model BlazorSrvPoc.Pages.IndexModel
@using BlazorSrvPoc.Data
@using BlazorSrvPoc.Services
@inject ApplicationDbContext DbContext
@inject RiskService RiskService
@inject NavigateService Navigate
<form asp-page-handler="Add" method="post">
@Html.AntiForgeryToken()
<div>
<label for="reference">Référence:</label>
<input id="reference" name="NewRisk.Reference" class="form-control" value="@Model.NewRisk.Reference" />
</div>
<div>
<label for="status">Statut:</label>
<input id="status" name="NewRisk.Status" class="form-control" type="number" value="@Model.NewRisk.Status" />
</div>
<div>
<label for="author">Auteur:</label>
<input id="author" name="NewRisk.Author" class="form-control" value="@Model.NewRisk.Author" />
</div>
<div>
<label for="dateIdentified">Date Identifiée:</label>
<input id="dateIdentified" name="NewRisk.DateIdentified" class="form-control" type="date" value="@Model.NewRisk.DateIdentified.ToString("yyyy-MM-dd")" />
</div>
<div>
<label for="title">Titre:</label>
<input id="title" name="NewRisk.Title" class="form-control" value="@Model.NewRisk.Title" />
</div>
<button type="submit" class="btn btn-primary">Ajouter</button>
</form>
我的Page.cshtml.cs的一部分
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using BlazorSrvPoc.Data;
using BlazorSrvPoc.Models;
using BlazorSrvPoc.Services;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace BlazorSrvPoc.Pages
{
public class IndexModel : PageModel
{
private readonly ApplicationDbContext _dbContext;
private readonly RiskService _riskService;
private readonly ILogger<IndexModel> _logger;
public IList<Risk> Risks { get; private set; }
[BindProperty]
public Risk NewRisk { get; set; }
public int NbRisk;
public IndexModel(ApplicationDbContext dbContext, RiskService riskService, ILogger<IndexModel> logger)
{
_dbContext = dbContext;
_riskService = riskService;
NewRisk = new Risk();
_logger = logger;
}
public async Task OnGetAsync()
{
Risks = await _dbContext.Risks.ToListAsync();
}
public async Task<IActionResult> OnPostAddAsync()
{
_logger.LogInformation("Starting OnPostAddRiskAsync method");
_logger.LogInformation("New Risk data: {Reference}, {Status}, {Author}", NewRisk.Reference, NewRisk.Status, NewRisk.Author);
_logger.LogCritical("Model State: {IsValid}", ModelState.IsValid);
if (!ModelState.IsValid)
{
Console.WriteLine("New Risk is not valid");
return Page();
}
try
{
_dbContext.Risks.Add(NewRisk);
await _dbContext.SaveChangesAsync();
Console.WriteLine("Risque créé :");
_logger.LogInformation("Number of risks after add: {Count}", Risks.Count);
Risks = await _dbContext.Risks.ToListAsync();
return Page();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
_logger.LogError(ex, "Error occurred while adding risk");
return Page();
}
}
}
}
以防万一,我的 Risk.cs 模型
namespace BlazorSrvPoc.Models
{
public class Risk
{
public int Id { get; set; }
public string Reference { get; set; }
public int Status { get; set; }
public string Title { get; set; }
public DateTime DateIdentified { get; set; }
public string Author { get; set; }
// Relations one-to-one
public RiskDescription Description { get; set; }
public RiskAnalysis Analysis { get; set; }
public RiskEvaluation Evaluation { get; set; }
// Relation one-to-many
public List<RiskTask> StateTasks { get; set; }
}
}
目前可能存在一些无用的代码,因为我已经尝试了几种方法来了解正在发生的情况。目前,页面呈现数据库中已有的风险列表,一旦我单击添加对象,页面就会重新呈现,没有数据(我想我明白为什么),但没有其他情况发生。数据库上没有任何内容,也没有记录任何内容,只有 Chrome 控制台中的 HTTP OK。
如果我可以向您展示其他东西,请告诉我。
在页面中添加 Taghelper 可以解决该问题。
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
完整代码
@page "/"
@model BlazorSrvPoc.Pages.IndexModel
@using BlazorSrvPoc.Data
@using BlazorSrvPoc.Services
@inject ApplicationDbContext DbContext
@inject RiskService RiskService
@inject NavigateService Navigate
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
<form asp-page-handler="Add" method="post">
@Html.AntiForgeryToken()
<div>
<label for="reference">Référence:</label>
<input id="reference" name="NewRisk.Reference" class="form-control" value="@Model.NewRisk.Reference" />
</div>
<div>
<label for="status">Statut:</label>
<input id="status" name="NewRisk.Status" class="form-control" type="number" value="@Model.NewRisk.Status" />
</div>
<div>
<label for="author">Auteur:</label>
<input id="author" name="NewRisk.Author" class="form-control" value="@Model.NewRisk.Author" />
</div>
<div>
<label for="dateIdentified">Date Identifiée:</label>
<input id="dateIdentified" name="NewRisk.DateIdentified" class="form-control" type="date" value="@Model.NewRisk.DateIdentified.ToString("yyyy-MM-dd")" />
</div>
<div>
<label for="title">Titre:</label>
<input id="title" name="NewRisk.Title" class="form-control" value="@Model.NewRisk.Title" />
</div>
<button type="submit" class="btn btn-primary">Ajouter</button>
</form>
解释
Razor 页面和 Razor 组件是不同的。您可以更多地了解它们的差异。
Blazor 项目默认不支持
TagHelper
。如果添加剃刀页面,可以按照上面代码手动添加,然后就可以运行了