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 mvc实现伪静态功能

  • 如何在多个项目中分离Asp.Net Core Mvc的Controller和Areas

  • asp.net core 编译mvc,routing,security源代码进行本地调试

  • ASP.NET Core MVC四种枚举绑定方式

  • ASP.NET Core MVC 模型绑定用法及原理

  • ASP.NET Core MVC 控制器创建与依赖注入

  • ASP.NET Core MVC 过滤器介绍

  • ASP.NET Core MVC Tag Helpers 介绍

  • ASP.NET Core MVC – Caching Tag Helpers

  • ASP.NET Core MVC – Form Tag Helpers

  • ASP.NET Core MVC – 自定义 Tag Helpers

  • ASP.NET Core - Razor 页面介绍

原文地址:http://www.cnblogs.com/tdfblog/p/razor-pages-handlers-in-asp-net-core.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JFreeChart(八)之时序图

转载自 JFreeChart时序图 时序图表显示的数据点在相等的时间间隔序列变化。本章演示了如何从一个给定的业务数据使用JFreeChart&#xff0c;建立时序图。 业务数据 让我们考虑通过使用标准 Java API 的 Math.random()产生的各种随机数。我们使用这些数字产生一个时间序列图…

立德树人

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】。最近&#xff0c;我的个人站上线啦&#xff0c;大家可以直接在浏览器的地址栏中输入&#xff1a;穆雄雄.com&#xff0c;轻轻敲击回车&#xff0c;即可直接进入……

.NET Standard 2.0 特性介绍和使用指南

前言 早上起来.NET社区沸腾了&#xff0c;期待已久的.NET Core 2.0终于发布&#xff01;根据个人经验&#xff0c;微软的产品一般在2.0时会趋于成熟&#xff0c;所以一个新的.Net开发时代已经来临&#xff01;未来属于.NET Core。 对于.NET Core 2.0的发布介绍&#xff0c;围绕…

2018/7/7-纪中某C组题【jzoj1494,jzoj1495,jzoj1496,jzoj1497】

前言 290卡成145&#xff0c;十分开心。 正题 T1&#xff1a;密码 大意 N个数乘起来 考试时 看起来十分简单的高精乘单精 解题思路 10241024其实是10241024高精乘高精了解一下&#xff0c;30分QAQ 代码(高精乘高精我就不解释了吧) #include<cstdio> #include<…

加油四班!加油佟穆!我们的征途是星辰大海!!!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号【雄雄的小课堂】首先&#xff0c;感谢佟老师与范老师&#xff0c;在我不在的时候&#xff0c;三班的就业和四班的学习都落在了两位老师的肩头&#xff0c;其次&#xff0c;还需要特别感谢冯老师&#xff0c;能抽时间…

JFreeChart(一)之架构

转载自 JFreeChart架构 本章介绍给大家介绍 JFreeChart 不同类中如何交互的概念, JFreeChart基本类层次和应用水平的架构在基于Java应用程序如何工作的。 类层次架构 类层次架构解释了如何把不同阶层的相互库交互&#xff0c;以创建不同类型的图表。 以下是在上述框图中使用…

体验 PHP under .NET Core

昨天在 The week in .NET 中发现 Scott Hanselman 的这篇博文 Peachpie - Open Source PHP Compiler to .NET and WordPress under ASP.NET Core&#xff0c;知道了 Peachpie PHP 编译器加入了 .NET 基金会&#xff0c;借助 Peachpie &#xff0c;.NET Core 已经支持 PHP 。 今…

上学的你,是不是最怕老师给家长打电话……

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号&#xff1a;雄雄的小课堂。今天&#xff0c;做了个重要的工作&#xff0c;趁着五一这个假期&#xff0c;准备和每个家长都通一次话&#xff0c;将学生在学习情况给家长说明一下&#xff0c;站在我的角度&#xff0c;也从…

2018/7/8-纪中某C组题【jzoj1619,jzoj1620,jzoj1621,jzoj1622】

前言 分数250250&#xff0c;十分开心 正题 T1&#xff1a;音乐节拍 洛谷题目链接&#xff1a;https://www.luogu.org/problemnew/show/P2969 大意 有n段音乐&#xff0c;每段音乐持续时间不同&#xff0c;q个询问求一个时间点再放那首歌 考试时 开始时发现询问的时间点不…

IDEA一定要改的8条配置

转载自 IDEA一定要改的8条配置 引言 坦白说&#xff0c;我很少写这种操作类型的文章。因为这种文章没啥新意&#xff0c;大家操作步骤肯定是一样的。然而&#xff0c;我答应了我的同事小阳&#xff0c;给她出一篇&#xff01;毕竟人家打算从Eclipse转IDEA了&#xff0c;于是…

.NET Core 2.0使用NLog

最近研究了一下NLog的使用方式&#xff0c;简单的入了一下门。 实现的功能&#xff0c;对于不同的日志&#xff0c;进行不同的记录&#xff0c;分别有系统运行日志&#xff0c;和个人在程序中写的异常日志。发布之后放在了IIS上。进行查看日志的信息 参考了两篇博客。 1.ht…

计划得一步一步实施,题库首先是第一步!

大家好&#xff0c;我是雄雄&#xff0c;好久没见了哈&#xff0c;欢迎关注公众号&#xff1a;雄雄的小课堂。今天上午没有讲课&#xff0c;听写以及把假期作业整理了下&#xff0c;部分学生的假期作业偷工减料&#xff0c;也都让让让他们挨个补上了。上午将对班级后期的整个计…

OMG!又一个频繁FullGC的案例

转载自 OMG&#xff01;又一个频繁FullGC的案例 将用户已安装APP数据从MySQL中迁移到MongoDB中。MySQL中存储方式比较简单&#xff0c;每个用户每个已安装的APP一行记录&#xff0c;且数据模型对应AppFromMySQL。迁移到MongoDB中&#xff0c;我们想更好的利用MongoDB的优势&a…

ASP.NET Core - 关于标签帮助器值得了解的五点

如果您开发过ASP.NET Core Web应用程序&#xff0c;您应该已经熟悉了标签帮助器。ASP.NET Core应用程序依赖标签帮助器来呈现表单和表单字段是很常见的。所以&#xff0c;一个视图通常包含许多标签帮助器以及标准的HTML标记。您可以通过多种方式使用标签帮助器来提高开发的效率…

存储过程示例整理

--列出服务器上所有的数据库 exec sp_databases--改数据库的名字 exec sp_renamedb QQDB, QQ--查看表users中的列 exec sp_columns users《此组件已作为此服务器安全配置的一部分而被关闭》的解决办法use master exec sp_configure show advanced options,1 --显示高级配置信息…

如何使用MAT进行JVM内存泄露分析

转载自 如何使用MAT进行JVM内存泄露分析 在《Java Agent的隔离实现以及卸载时一些坑》中&#xff0c;卸载Agent之后&#xff0c;使用 jmap-histo:live pid命令验证执行FGC&#xff0c;相关Class是否会被回收&#xff0c;结果遇到了一些问题&#xff0c;最终通过MAT内存分析才…

Ribbon 客户端负载均衡

文章目录零、懒汉式改为饿汉式一、基于配置文件二、基于Bean配置三、自定义规则1 权重优先调用2 集群优先调用3 元数据优先调用零、懒汉式改为饿汉式 【consumer-springboot-80子模块】 Ribbon默认使用懒汉式加载服务列表&#xff0c;更改为懒汉式 application.yml ribbon: …

C#使用Xamarin开发可移植移动应用(3.Xamarin.Views控件)附源码

.NET core2.0 发布了,刺激,大致看了一下,很不错,打算后期学习.(不出意外,应该也会写个小系列). 虽然官方推荐用共享类库创建新的类库..然而我这个Demo还是使用的可移植.. 嗯..解释一下 为什么暂时没用共享类库.. 有些小BUG 可能是为了迎合其他类型的项目..所以在共享类库里创…

“老师,我不要苹果味的,我要葡萄味的”!

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注公众号【雄雄的小课堂】。题库四班目前题库正在维护中&#xff0c;工作量最大的莫过于题库里面的题量了&#xff0c;所以目前的解决方法是让动员大家一起出题&#xff0c;但是人多较杂&#xff0c;各种各样的题都有&#xff08;…

一次频繁Full GC的排查过程,根源居然是它...

转载自 一次频繁Full GC的排查过程&#xff0c;根源居然是它... 业务部门的一个同事遇到个奇怪的 Full GC 问题&#xff0c;有个服务迁移到新的应用后&#xff0c;一直频繁 Full GC。新应用机器的配置是 4c 8g&#xff0c;老应用是 4c 4g&#xff0c;老应用 GC 都很正常&…