ASP.NET Core中Razor页面的Handlers处理方法详解

 更新时间:2022年02月22日 09:11:15   作者:Sweet-Tang  
本文详细讲解了ASP.NET Core中Razor页面的Handlers处理方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

简介

前一篇文章中,我们讨论了Razor页面。今天我们来谈谈处理方法(Handlers)。

我们知道可以将代码和模型放在 .cshtml 文件里面或与 .cshtml 匹配的 .cshtml.cs 文件中。

Razor页面处理程序或处理方法将用户请求匹配到我们的方法;请求来自 **.cshtml **文件。

Razor页面遵循特定的命名约定。从上一篇文章可以看出,.NET Core开发工具自动生成了很多处理方法,例如下面这些:

  • OnGet
  • OnPost
  • OnGetAsync
  • OnPostAsync
  • OnPostRemoveLoginAsync
  • OnGetLinkLoginCallbackAsync
  • etc..

从列表中,我们可以看到这些名称遵循的具体模式。它们都是从On开始,随后Get或者Post,再其次是可选的 Handler名称(RemoveLogin,LinkLoginCallback),最后Async后缀为异步方法。

示例项目可在GitHub上找到,需要使用最新的.NET Core 2.0.0 CLI

默认POST和GET处理方法

打开页面将在代码背后触发默认的GetGetAsync处理方法;类似地,提交表单将触发默认PostPostAsync处理方法:

    <form method="POST">
        <div>Name: <input asp-for="Category.Name" /></div>
        <div>Description: <input asp-for="Category.Description" /></div>
        <button type="submit" class="btn btn-primary">Save</button>
    </form>

触发的方法:

    public async Task<IActionResult> OnPostAsync()
    {
        if (!ModelState.IsValid)
        {
            return Page();
        }

        _dbContext.Categories.Add(Category);
        await _dbContext.SaveChangesAsync();

        return RedirectToPage("./Index");
    }

使用OnPostAsyncOnPost为处理方法名称都可以正常工作。如果您使用的是OnPost,那么代码中不能使用异步调用。

但是,如果您同时实现两种OnPostAsyncOnPOST等处理方法,您会遇到这样的问题:

自定义处理方法名称

除了默认的处理方法名称,我们还可以指定自定义名称。

在 .cshtml 文件中的实现以下代码:

    <form method="POST">
        <div>Description: <input asp-for="Category.Description" /></div>
        <input type="submit" value="Save First" asp-page-handler="First" class="btn btn-primary btn-xs" />
    </form>

这会创建一个包含Description字段的简单表单:

在Razor页面中,将表单处理方法添加到匹配的 .cshtml.cs 文件代码文件,方法命名为:OnPostFirst 或 OnPostFirstAsync ,具体取决于要在其中运行的代码类型。假设我们需要在数据库中插入Category并保存这些更改,使用Entity Framework的异步方法:

    public async Task<IActionResult> OnPostFirstAsync()
    {

        Category.Name = "First";
        _dbContext.Categories.Add(Category);
        await _dbContext.SaveChangesAsync();

        return RedirectToPage("./Categories/Index");
    }

请注意名称 OnPost First Async 。

同一页面多个POST处理方法

让我们扩展刚才这一段代码,添加POST方法另一种形式:

下面是 .cshtml 的代码:

    <form method="POST">
        <div>Description: <input asp-for="Category.Description" /></div>
        <input type="submit" value="Save First" asp-page-handler="First" class="btn btn-primary btn-xs" />
    </form>
    <form method="POST">
        <div>Description: <input asp-for="Category.Description" /></div>
        <input type="submit" value="Save Second" asp-page-handler="Second" class="btn btn-primary btn-xs" />
    </form>

这两个表单将分别匹配代码中这两种方法:

    public async Task<IActionResult> OnPostFirstAsync()
    {
        return await InsertCatepory("First");
    }

    public async Task<IActionResult> OnPostSecondAsync()
    {
        return await InsertCatepory("Second");
    }

    private async Task<IActionResult> InsertCatepory(string name)
    {

        Category.Name = name;
        _dbContext.Categories.Add(Category);
        await _dbContext.SaveChangesAsync();

        return RedirectToPage("./Categories/Index");
    }

关键的代码是使用 asp-page-handler Tag Helper,指定表单的处理方法的名称。

我们也可以在一个表单通过两个提交按钮实现同样的事情:

    <form method="POST">
        <div>Description: <input asp-for="Category.Description" /></div>
        <input type="submit" value="Save First" asp-page-handler="First" class="btn btn-primary btn-xs" />
        <input type="submit" value="Save Second" asp-page-handler="Second" class="btn btn-primary btn-xs" />
    </form>

处理方法参数

将参数传递给处理方法有两种方法:

  • 表单输入
  • 表单元素借助 asp-route Tag Helper

通过表单输入传递参数

对于表单输入作为输入参数,名称必须是同步的。HTML input元素的名称必须与处理方法参数的名称相匹配:

    <form method="POST">
        <input type="text" name="query"/>
        <button type="submit" asp-page-handler="search">Search</button>
    </form>
    public async Task OnPostSearchAsync(string query)
    {
        Categories = await _dbContext
            .Categories
            .AsNoTracing()
            .Where(c => !string.IsNullOrEmpty(c.Description) && c.Description.Contains(query))
            .ToListAsync();
    }

通过路由传递参数

以下是通过路由发送参数的两个示例:

    <div>
        <form method="post" asp-page-handler="search" asp-route-query="Core">    
            <button>Search "Core"</button>
        </form>
    </div>

    <div>
        <form method="post" asp-page-handler="delete" asp-route-id="1">
            <button>Delete ID 1</button>
        </form>
    </div>

第一个是以前看到的search处理方法,它发送“Core”作为查询参数。

第二个是针对delete处理方法,并发送id1,这表示它会删除第一条数据。

    public async Task OnPostSearchAsync(string query)
    {
        Categories = await _dbContext
            .Categories
            .AsNoTracking()
            .Where(c => !string.IsNullOrEmpty(c.Description) && c.Description.Contains(query))
            .ToListAsync();
    }

    public async Task<IActionResult> OnPostDeleteAsync(int id)
    {
        var category = await _dbContext.Categories.FindAsync(id);

        if (category != null) {
            _dbContext.Categories.Remove(category);
            await _dbContext.SaveChangesAsync();
        }

        return RedirectToPage();
    }

到此这篇关于ASP.NET Core中Razor页面的Handlers处理方法详解的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • .Net中Task Parallel Library的基本用法

    .Net中Task Parallel Library的基本用法

    这篇文章介绍了.Net中Task Parallel Library的基本用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • ASP.NET MVC使用区域(Area)功能

    ASP.NET MVC使用区域(Area)功能

    这篇文章介绍了ASP.NET MVC使用区域(Area)功能的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • .Net结构型设计模式之享元模式(Flyweight)

    .Net结构型设计模式之享元模式(Flyweight)

    这篇文章介绍了.Net结构型设计模式之享元模式(Flyweight),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • .NET 6更新使.NET生态系统蜕变

    .NET 6更新使.NET生态系统蜕变

    微软正式发布.NET最新长期支持版本.NET 6,这个版本的更新重点,除了C#和F#都有许多语言功能改进之外,.NET 6终于集大成,成为跨浏览器、云计算、桌面、物联网和移动应用程序的统一平台,性能也获得大幅提升,并且更完整支持Arm64
    2022-01-01
  • WPF布局及布局容器介绍

    WPF布局及布局容器介绍

    这篇文章介绍了WPF布局及布局容器,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • SqlConnection.ConnectionString相关关键字

    SqlConnection.ConnectionString相关关键字

    SqlConnection.ConnectionString相关关键字...
    2007-01-01
  • .Net性能测试框架Crank的使用方法

    .Net性能测试框架Crank的使用方法

    这篇文章介绍了.Net性能测试框架Crank的使用方法。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • ASP.NET Core中HttpContext详解与使用

    ASP.NET Core中HttpContext详解与使用

    这篇文章介绍了ASP.NET Core中HttpContext详解与使用,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01
  • ASP.NET中ImageButton图片按钮控件的使用

    ASP.NET中ImageButton图片按钮控件的使用

    本文主要介绍ImageButton控件的基础使用方法,该控件类似Button控件,但又比Button丰富,下面看它的具体使用。
    2016-04-04
  • .Net结构型设计模式之适配器模式(Adapter)

    .Net结构型设计模式之适配器模式(Adapter)

    这篇文章介绍了.Net结构型设计模式之适配器模式(Adapter),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论