ASP.NET Core 中的 Razor Pages
Razor Pages
Razor Pages 是基于页面的 ASP.NET Core Web App 架构。
相比 MVC 模式,Razor Pages的生产效率更快。
Razer Pages 需要两个中间件:
- builder…Services.AddRazorPages 添加 Razor Pages services
- app.MapRazorPages 添加 Razor Pages endpoints
.cshtml 与 .cshtml.cs
在最简单的页面中:
@page
<h1>Hello, world!</h1>
<h2>The time on the server is @DateTime.Now</h2>
看起来与 MVC 的页面差不多,但特别之处是有一个 @page 指令,@page 指令意味着这个页面可以直接接收 http request,而不需要通过 controller。
第2个页面Pages/Index2.cshtml 的代码是这样的:
@page
@using RazorPagesIntro.Pages
@model Index2Model<h2>Separate page model</h2>
<p>@Model.Message
</p>
使用了 @using RazorPagesIntro.Pages 指令,
而RazorPagesIntro.Pages的实现代码Pages/Index2.cshtml.cs是这样的:
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using System;namespace RazorPagesIntro.Pages
{public class Index2Model : PageModel{public string Message { get; private set; } = "PageModel in C#";public void OnGet(){Message += $" Server time is { DateTime.Now }";}}
}
一个Index2.cshtml 页面,搭配一个Index2.cshtml.cs,类似WPF 中的 xaml与 xaml.cs。
URL Path 路由
url 的 Path 与页面的 path 相匹配。比如:
- / or /Index 匹配 /Pages/Index.cshtml
- /Contact 匹配 /Pages/Contact.cshtml
- /Store/Contact 匹配 /Pages/Store/Contact.cshtml
一个 Post 例子
有一个Pages/Customers/Create.cshtml 的 view 页面,代码如下:
@model 指令中的CreateModel 对应一个名为 Create 的 Model,
而 Form 的 submit 会发生 Http Post,
@page
@model RazorPagesContacts.Pages.Customers.CreateModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers<p>Enter a customer name:</p><form method="post">Name:<input asp-for="Customer!.Name" /><input type="submit" />
</form>
相应的Pages/Customers/Create.cshtml.cs 的代码中的部分如下:
OnPostAsync 处理 cshtml 中的 form submit,
一般还会有一个OnGet方法处理Http Get 请求。
RedirectToPage 方法会重定向到 ./Index 路径。
[BindProperty] 注解属性是表示model binding。
Razor Pages 中的BindProperty 一般用于非 GET 的属性。
[BindProperty]
public Customer? Customer { get; set; }public async Task<IActionResult> OnPostAsync()
{if (!ModelState.IsValid){return Page();}if (Customer != null) _context.Customer.Add(Customer);return RedirectToPage("./Index");
}
Home Page 的例子
Index.cshtml
@page
@model RazorPagesContacts.Pages.Customers.IndexModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers<h1>Contacts home page</h1>
<form method="post"><table class="table"><thead><tr><th>ID</th><th>Name</th><th></th></tr></thead><tbody>@if (Model.Customers != null){foreach (var contact in Model.Customers){<tr><td> @contact.Id </td><td>@contact.Name</td><td><!-- <snippet_Edit> --><a asp-page="./Edit" asp-route-id="@contact.Id">Edit</a> |<!-- </snippet_Edit> --><!-- <snippet_Delete> --><button type="submit" asp-page-handler="delete" asp-route-id="@contact.Id">delete</button><!-- </snippet_Delete> --></td></tr>}}</tbody></table><a asp-page="Create">Create New</a>
</form>
其中的
<a asp-page="./Edit" asp-route-id="@contact.Id">Edit</a> |
使用asp-route-id 生成指向Edit页面的URL,URL 中包含 Contact id,比如:
https://localhost:5001/Edit/1
而delete方法的html
<button type="submit" asp-page-handler="delete" asp-route-id="@contact.Id">delete</button>
由 server 生成后的html是:
<button type="submit" formaction="/Customers?id=1&handler=delete">delete</button>
对应的 Model 的代码Index.cshtml.cs:
public class IndexModel : PageModel
{private readonly Data.CustomerDbContext _context;public IndexModel(Data.CustomerDbContext context){_context = context;}public IList<Customer>? Customers { get; set; }public async Task OnGetAsync(){Customers = await _context.Customer.ToListAsync();}public async Task<IActionResult> OnPostDeleteAsync(int id){var contact = await _context.Customer.FindAsync(id);if (contact != null){_context.Customer.Remove(contact);await _context.SaveChangesAsync();}return RedirectToPage();}
}
使用Layouts,Partial,模板和Tag Helpers
待更新
URL Generation
待更新
ViewData 属性
待更新
TempData 属性
待更新
相关文章:
ASP.NET Core 中的 Razor Pages
Razor Pages Razor Pages 是基于页面的 ASP.NET Core Web App 架构。 相比 MVC 模式,Razor Pages的生产效率更快。 Razer Pages 需要两个中间件: builder…Services.AddRazorPages 添加 Razor Pages servicesapp.MapRazorPages 添加 Razor Pages endpo…...
C语言入门 Day_14 for循环
目录 1.for循环 2.循环执行顺序 3.易错点 4.思维导图 前言 我们定义了一个数组以后,要使用(读取或者修改)数组元素的话,可以一个一个的读取,就前两课学的那样,代码类似这个结构。 int …...
深入解析 Socks5 代理与网络安全
作为网络工程师和网络文章主编,我们时刻关注着网络世界中的新趋势和技术发展。本文将探讨 Socks5 代理、代理IP、网络安全以及与之相关的 HTTP 协议,为您呈现一个深入的技术洞察。 引言 在今天的互联网时代,网络安全是至关重要的话题。攻击…...
Vue + Element UI 前端篇(十二):用户管理模块
Vue Element UI 实现权限管理系统 前端篇(十二):用户管理模块 用户管理模块 添加接口 在 http/moduls/user.js 中添加用户管理相关接口。 import axios from ../axios/* * 用户管理模块*/// 保存 export const save (params) > {ret…...
C# 设计保存文件
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System...
Leetcode 1486.数组异或操作
给你两个整数,n 和 start 。 数组 nums 定义为:nums[i] start 2*i(下标从 0 开始)且 n nums.length 。 请返回 nums 中所有元素按位异或(XOR)后得到的结果。 示例 1: 输入:n 5, …...
【Java】Java核心API概述
Java核心API是Java编程语言的基础,包含了Java应用程序中常用的类和接口。本文将介绍Java核心API中的一些重要部分,包括输入输出流、异常处理、集合框架、多线程和网络编程等。 1、输入输出流 Java的输入输出流API是Java IO,它提供了处理输入…...
微信小程序检查版本更新
新建文件 version-util.js // 小程序启动时检查版本 class VersionUtil {/*** 检查更新*/checkUpdate(){const updateManager wx.getUpdateManager();updateManager.onCheckForUpdate((hasUpdate)>{if(hasUpdate){updateManager.onUpdateReady(()>{wx.showModal({title…...
Linux查看是虚拟机还是物理机
第一种方式:dmesg命令 [roottest ~]# dmesg | grep -i hypervisor [ 0.000000] Hypervisor detected: VMware [ 0.001000] TSC freq read from hypervisor : 2903.999 MHz [ 6.311621] [drm] Max dedicated hypervisor surface memory is 0 kiB第二种方式…...
【数据结构】二叉搜索树——二叉搜索树的概念和介绍、二叉搜索树的简单实现、二叉搜索树的增删查改
文章目录 二叉搜索树1. 二叉搜索树的概念和介绍2. 二叉搜索树的简单实现2.1二叉搜索树的插入2.2二叉搜索树的查找2.3二叉搜索树的遍历2.4二叉搜索树的删除2.5完整代码和测试 二叉搜索树 1. 二叉搜索树的概念和介绍 二叉搜索树又称二叉排序树,它或者是一棵空树&…...
通过linux定时任务删除es日志索引
能过linux定时任务删除es日志索引 项目用上了elk,产生的日志索引要定时,其一个方法,通过linux定时任务,调用es接口删除索引。 #!/bin/bash #删除ELK30天前的日志 #计算索引名称包含的日期,比如这里是 %Y.%m.%d (2023…...
【跟小嘉学 Rust 编程】二十二、常用 API
系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...
【ES6】Class中this指向
先上代码: 正常运行的代码: class Logger{printName(name kexuexiong){this.print(hello ${name});}print(text){console.log(text);} }const logger new Logger(); logger.printName("kexueixong xiong");输出: 单独调用函数p…...
Python 编程竟然如此幽默!揭秘程序员们的搞笑日常,快来看看吧!
食用原文效果更佳,原文链接 Python 编程竟然如此幽默!揭秘程序员们的搞笑日常,快来看看吧! 在 Python 编程的世界里,充满了智慧与创造力。 当然,也少不了轻松幽默的段子,这些段子让程序员们在…...
Linux c++开发-03-使用CMake组织工程
一、简单文件的编译 有如下的目录结构: 其中 helloworld.cpp如下: #include <iostream> using namespace std; int main() {printf("hello world my name is Ty!");return 0; }CMakeLists.txt如下: cmake_minimum_requir…...
【C++】函数重载 ④ ( 函数指针定义的三种方式 | 直接定义函数指针 | 通过 函数类型 定义 函数指针 | 通过 函数指针类型 定义 函数指针 )
文章目录 一、函数指针定义方法1、直接定义函数指针2、通过 函数类型 定义 函数指针3、通过 函数指针类型 定义 函数指针4、代码示例 - 不同方式定义函数指针 博客总结 : 重载函数 : 使用 相同 的 函数名 , 定义 不同 的 函数参数列表 ;判定标准 : 只有 函数参数 的 个数 / 类…...
异常-java
目录 一、异常的概念和体系结构 1.1 异常的概念 1.2 异常的体系结构 1.3 异常的分类 二、异常的处理 2.1 防御式编程 2.2 异常抛出 2.3 异常捕获 2.4 异常处理流程 三、自定义异常类 一、异常的概念和体系结构 1.1 异常的概念 程序员在开发过程中,想要将代码写得…...
软件测试/测试开发丨Selenium Web自动化测试 高级控件交互方法
点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27045 一、使用场景 使用场景对应事件复制粘贴键盘事件拖动元素到某个位置鼠标事件鼠标悬停鼠标事件滚动到某个元素滚动事件使用触控笔点击触控笔事件&am…...
深入Go语言:进阶指南
深入Go语言:进阶指南 欢迎来到深入Go语言的进阶指南。如果你已经熟悉Go语言的基础知识,想要更深入地探索这门语言的高级特性和技巧,那么本篇博客将为你提供有关Go语言的更多深入内容。 Go语言的并发编程 Go语言以其强大的并发支持而闻名。…...
FOXBORO FBM232 P0926GW 自动化控制模块
Foxboro FBM232 P0926GW 是 Foxboro(福克斯博罗)自动化控制系统的一部分,通常用于监测和控制工业过程。以下是关于这种类型的自动化控制模块可能具有的一些常见功能: 数字输入通道: FBM232 P0926GW 控制模块通常具有多…...
【玩转Jetson TX2 NX】(四)M.2 SSD系统迁移实战:从克隆到无缝启动
1. 为什么需要将系统迁移到M.2 SSD? Jetson TX2 NX作为一款嵌入式AI计算设备,默认搭载的eMMC存储空间往往捉襟见肘。我在实际项目中发现,16GB的eMMC在安装完JetPack系统后,剩余空间连一个中等规模的深度学习模型都放不下。更不用…...
FakeLocation终极指南:三分钟掌握Android应用级虚拟定位黑科技
FakeLocation终极指南:三分钟掌握Android应用级虚拟定位黑科技 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 你是否曾想过在手机上"瞬间移动"到世界任何角…...
MOOTDX:Python通达信数据接口的完整指南
MOOTDX:Python通达信数据接口的完整指南 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx MOOTDX是一个专为量化投资和股票数据分析设计的Python通达信数据接口封装库,它提供…...
哔哩下载姬终极指南:三步掌握B站视频批量下载技巧
哔哩下载姬终极指南:三步掌握B站视频批量下载技巧 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等࿰…...
Next.js 14全栈样板工程解析:集成Prisma与NextAuth的现代Web开发实践
1. 项目概述:一个为现代Web应用量身定制的启动器如果你正在寻找一个能让你跳过繁琐的初始化配置,直接进入核心业务逻辑开发的Next.js项目起点,那么nemanjam/nextjs-prisma-boilerplate这个项目很可能就是你需要的。这不是一个简单的“Hello W…...
如何快速部署FastGithub:终极GitHub加速配置指南
如何快速部署FastGithub:终极GitHub加速配置指南 【免费下载链接】FastGithub github定制版的dns服务,解析访问github最快的ip 项目地址: https://gitcode.com/gh_mirrors/fa/FastGithub FastGithub是一款专为开发者设计的智能DNS加速工具&#x…...
蓝桥杯单片机备赛:AT24C02 EEPROM存储整型数据的完整流程与常见错误分析
蓝桥杯单片机备赛:AT24C02 EEPROM存储整型数据的完整流程与常见错误分析 在蓝桥杯单片机竞赛中,AT24C02 EEPROM模块是必考内容之一。许多选手已经掌握了基本字符型数据的读写操作,但当面对整型数据时,往往会遇到各种问题。本文将深…...
TensorBoard命令找不到?别慌,用pip install tensorboard和tensorflow两步搞定
TensorBoard命令找不到?三步彻底解决环境配置难题 刚接触深度学习的新手们,第一次在终端输入tensorboard --logdirlogs时,大概率会遇到那个令人沮丧的报错:"tensorboard: command not found"。这就像学开车时发现方向盘…...
物联网设备网络无缝切换与多网融合:exnetif模块实战指南
1. 项目概述:为什么我们需要exnetif? 在物联网项目的实际开发中,我遇到过太多因为网络环境不稳定而导致的“玄学”问题。比如,一个部署在工厂车间的智能网关,原本通过稳定的有线以太网连接云端,一旦生产线调…...
在 Claude Code 中配置 Taotoken 以解决封号与 Token 不足问题
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在 Claude Code 中配置 Taotoken 以解决封号与 Token 不足问题 对于依赖 Claude Code 进行编程辅助的开发者而言,服务中…...
