Blazor OnPost***异步未触发

问题描述 投票:0回答:1

我正在开发 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。

如果我可以向您展示其他东西,请告诉我。

asp.net curl razor blazor-server-side
1个回答
0
投票

在页面中添加 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>

解释

  1. Razor 页面和 Razor 组件是不同的。您可以更多地了解它们的差异。

  2. Blazor 项目默认不支持

    TagHelper
    。如果添加剃刀页面,可以按照上面代码手动添加,然后就可以运行了

© www.soinside.com 2019 - 2024. All rights reserved.