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处理方法
打开页面将在代码背后触发默认的Get或GetAsync处理方法;类似地,提交表单将触发默认Post或PostAsync处理方法:
<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");
}
使用OnPostAsync或OnPost为处理方法名称都可以正常工作。如果您使用的是OnPost,那么代码中不能使用异步调用。
但是,如果您同时实现两种OnPostAsync和OnPOST等处理方法,您会遇到这样的问题:

自定义处理方法名称
除了默认的处理方法名称,我们还可以指定自定义名称。
在 .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处理方法,并发送id为1,这表示它会删除第一条数据。
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 Pages – Handler Methods》https://codingblast.com/asp-net-core-razor-pages-handlers/
翻译:Sweet Tang
本文地址:http://www.cnblogs.com/tdfblog/p/razor-pages-handlers-in-asp-net-core.html
欢迎转载,请在明显位置给出出处及链接。
ASP.NET Core - Razor页面之Handlers处理方法的更多相关文章
- ASP.Net Core Razor+AdminLTE 小试牛刀
AdminLTE 一个基于 bootstrap 的轻量级后台模板,这个前端界面个人感觉很清爽,对于一个大后端的我来说,可以减少较多的时间去承担前端的工作但又必须去独立去完成一个后台系统开发的任务,并且 ...
- C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式
C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...
- 学习ASP.NET Core Razor 编程系列一
一. 概述 .NET Core 1.0发布的时候就想进行学习的,不过根据微软的以往的发布规律1.0版可以认为是大众测试版,2.0才算稳定.现在2.1都已经发布了预览版,之前对其"不稳定&qu ...
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
C#编译器优化那点事 使用C#编写程序,给最终用户的程序,是需要使用release配置的,而release配置和debug配置,有一个关键区别,就是release的编译器优化默认是启用的.优化代码 ...
- ASP.NET Core - Razor 页面简介
简介 随着ASP.NET Core 2 即将来临,最热门的新事物是Razor页面.在之前的一篇文章中,我们简要介绍了ASP.NET Core Razor 页面. Razor页面是ASP.NET Cor ...
- ASP.NET Core - Razor 页面介绍
简介 随着ASP.NET Core 2 即将来临,最热门的新事物是Razor页面.在之前的一篇文章中,我们简要介绍了ASP.NET Core Razor 页面. Razor页面是ASP.NET Cor ...
- 学习ASP.NET Core Razor 编程系列五——Asp.Net Core Razor新建模板页面
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列九——增加查询功能
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 学习ASP.NET Core Razor 编程系列十九——分页
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
随机推荐
- Array和ArrayList的区别与联系
博主今天去了一个java的实习面试,发现有好多java最基础的数据结构对于博主来说反而感到陌生,在面试官问一些常见的例如HashMap这样的数据结构,博主能回答的头头是道,但是在问到Array和Arr ...
- springboot1.5.4 配置druid1.1.0(使用druid-spring-boot-starter)
原文:https://github.com/x113773/testall/issues/11 ### Druid 最近发布了1.1.0 版本,并且提供了 [druid-spring-boot-sta ...
- Pycharm创建的virtualenv环境缺失pip.exe的问题(Windows系统)
Windows环境: 1. Python安装在d:\Python\Python35下, Python新版本安装时默认会勾选pip功能 2. PyCharm的Settings中Create Virtua ...
- 前端如何将H5页面打包成本地app?
大家都知道H5页面怎么在手机浏览器里测试,但是如何能打包成APP测试呢?因为本人的手机是IOS系统,如果用Xcode打包需要开发证书,貌似99美元一年.意外发现一个叫Hbuild的软件,简单好用,下面 ...
- 在ASP.NET CORE 2.0使用SignalR技术
一.前言 上次讲SignalR还是在<在ASP.NET Core下使用SignalR技术>文章中提到,ASP.NET Core 1.x.x 版本发布中并没有包含SignalR技术和开发计划 ...
- 从源码的角度看Activity是如何启动的
欢迎访问我的个人博客,原文链接:http://wensibo.top/2017/07/03/Binder/ ,未经允许不得转载! 大家好,今天想与大家一起分享的是Activity.我们平时接触的最多的 ...
- Linux内核互斥锁--mutex
一.定义: /linux/include/linux/mutex.h 二.作用及访问规则: 互斥锁主要用于实现内核中的互斥访问功能.内核互斥锁是在原子 API 之上实现的,但这对于内核用户是不可见 ...
- 用Node.JS+MongoDB搭建个人博客(安装环境)(一)
Node.JS是什么? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Nod ...
- Swift 轻量级网络层设计
前言 普遍我们的网络层设计的时候直接是如下结构APIManager.post(url, parameter,completeHandle),服务器配置在APIManager.m文件中进行配置.这样一个 ...
- ES6解构赋值
前面的话 我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段.在ES6中添加了可以简化这种任务的新特性:解构.解构是一种打破数据结构,将其拆分为更小部分的过程.本文将详细介绍ES6解构赋值 ...