如何通过 ASP.NET Core/Razor 单击按钮来运行在 Razor 页面上编写的 C#?

Yec*_*ats 3 c# razor asp.net-core razor-pages

我想在单击页面上的按钮时执行我直接在 razor 页面上编写的 C# 方法。我发现,如果我引用了页面上的按钮,它会在第一次加载时执行该方法,但当我实际单击该按钮时,它不会再次执行。这是代码:

Razor 页面 C# 参考:

@functions
{
    int productIndex = 0;

    int AddProduct()
    {
        productIndex = productIndex + 1;
        return productIndex;
    }
}
Run Code Online (Sandbox Code Playgroud)

按钮参考:

 <button type="button" class="btn btn-success" onclick="@AddProduct()" value="New Product" />
Run Code Online (Sandbox Code Playgroud)

我也尝试过这个参考并得到相同的结果:

<input class="btn btn-success" onclick="@AddProduct()" value="New Product"/>
Run Code Online (Sandbox Code Playgroud)

我的第二部分问题是如何阻止它在页面加载时执行,以便它只在单击时运行?我找到了参考文献,Page.IsPostBack)但这似乎在客户端上未被识别。

小智 8

这就是我在按钮后面实现 C# 代码所做的事情。

我的按钮执行调用函数的后操作OnPostGenerateWebName()(按钮的处理程序名称为GenerateWebName),因此按钮的后操作将查找并运行名为 的函数OnPost<handler name>

首先我在网页(BusinessDetails.cshmtl文件)上创建了一个按钮:

<button type="submit" asp-page-handler="GenerateWebName" class="btn btn-outline-info" 
id="btnGenerateWebName">Generate Business Web Name</button>
Run Code Online (Sandbox Code Playgroud)

OnPostGenerateWebName接下来,我用 C#创建处理程序(在BusinessDetails.cshtml.cs文件中),该处理程序调用另一个 C# 函数CreateWebName()

public async Task<IActionResult> OnPostGenerateWebName(string returnUrl = null)
{
    CreateWebName();

    // all  done
    return Page();
}

private void CreateWebName()
{
    //generate a web name for this business
    if (Business.BusinessName.Length > 0)
    {
        var WebName = Business.BusinessName;
        // remove all special characters, only keep 0-9,a-z,A-Z
        WebName = Regex.Replace(Business.BusinessName, "[^0-9a-zA-Z]+", "");
        // set the new web name
        ModelState.Clear();
        Business.BusinessWebName = WebName;
    }
}
Run Code Online (Sandbox Code Playgroud)

此函数根据企业名称创建 Web 名称,并通过设置基础类模型元素在表单上显示 Web 名称Business.BusinessWebName。为了使其显示在表单上,​​我必须调用ModelState.Clear().