ASP.NET Core之Razor Page相关
cshtml一般是这样:
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
@page是引导性的声明,表明是一个Page页面,并且是默认路由,即以在Pages文件夹的相对位置来进行路由匹配。
后面也可以跟路由参数,如:
@page "/johnyangtest/{id}"
@model RazorTest.Pages.TestModel
@{
}
<p>This is Test...,IDD is @Model.IDD</p>
上面 @page后面加\,表明是绝对路径,即不管该cshtml放在哪里,都是访问https://xxxx:xxx/johnyangtest/xx,就访问到这个页面了。

@model是背后的ViewModel数据类
@{}可以写不写入Response的C#代码
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
@{
Console.WriteLine("Hello world johnyang test");//又多写了一个
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

生成URL
(1)用PageModel自带的Url属性的Page方法(对于MVC,就用其Action()方法),只需要传入相对于Pages的相对文件就行,不论相对文件中的@page后面加没有加特定指定。
@page "/johnyangtestrazor/{id}"
@model RazorTest.Pages.TestModel
@{
}
<p>This is Test...,IDD is @Model.IDD</p>
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace RazorTest.Pages
{
public class TestModel : PageModel
{
public int IDD;
public void OnGet(int id)
{
IDD = id;
var url = Url.Page("Test", new {id=12345});
}
}
}

(2)用LinkGenerator来产生URL
LinkGenerator需要提供更多参数来唯一定义需要产生的URL,这使得它更灵活,另外它可以用在程序的任意地方,这一点不同于IUrlHelper(只能用在request的Context中)。
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Runtime.CompilerServices;
namespace RazorTest.Pages
{
public class TestModel : PageModel
{
public int IDD;
private readonly LinkGenerator _link;
public TestModel(LinkGenerator linkGenerator)
{
_link = linkGenerator;
}
public void OnGet(int id)
{
IDD = id;
var url = Url.Page("Test", new {id=12345});
var url1 = _link.GetPathByPage(HttpContext, "Test");
var url2 = _link.GetPathByPage("Test");
var url3 = _link.GetUriByPage("Test", null, null, "https", new HostString("johnyang.site"));
Console.WriteLine(url);
Console.WriteLine(url1);
Console.WriteLine(url2);
Console.WriteLine(url3);
}
}
}

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Runtime.CompilerServices;
namespace RazorTest.Pages
{
public class TestModel : PageModel
{
public int IDD;
private readonly LinkGenerator _link;
public TestModel(LinkGenerator linkGenerator)
{
_link = linkGenerator;
}
public void OnGet(int id)
{
IDD = id;
var url = Url.Page("Test", new {id=12345});
var url1 = _link.GetPathByPage(HttpContext, "/Test");//使用当前HttpContext中的参数
var url2 = _link.GetPathByPage("/Test", values: new {id=345});//自己指定参数
var url3 = _link.GetUriByPage("/Test", null, values:new{ id=234}, "https", new HostString("johnyang.site"));
Console.WriteLine(url);
Console.WriteLine(url1);
Console.WriteLine(url2);
Console.WriteLine(url3);
}
}
}

Custormize Conventions With Razor Pages
//路由相关设置
builder.Services.Configure<RouteOptions>(o=>
{
o.LowercaseUrls = true;
o.LowercaseQueryStrings = true;
o.AppendTrailingSlash = true;
});
//RazorPage相关设置
builder.Services.AddRazorPages().AddRazorPagesOptions(opt =>
{
//opt.RootDirectory = "/MyPages";
//opt.Conventions.AddPageRoute("/Test", "/johnyang-test");
});
AddPageRoute()添加了执行页面的另一个途径,并不是像@model那样,直接替换之前的路径。
下面的demo,给出了添加这样的路径,即统一在原有的URL之前加上"johnyangpage"。
public class PrefixingPageRouteModelConvention : IPageRouteModelConvention
{
public void Apply(PageRouteModel model)
{
var selectors = model.Selectors.Select(selector => new SelectorModel
{
AttributeRouteModel=new AttributeRouteModel
{
Template=AttributeRouteModel.CombineTemplates("pagejohnyang",selector.AttributeRouteModel!.Template),
}
}).ToList();
foreach(var newSelector in selectors)
{
model.Selectors.Add(newSelector);
}
}
}
//RazorPage相关设置
builder.Services.AddRazorPages().AddRazorPagesOptions(opt =>
{
//opt.RootDirectory = "/MyPages";
//opt.Conventions.AddPageRoute("/Test", "/johnyang-test");
opt.Conventions.Add(new PrefixingPageRouteModelConvention());
});

因为是添加,所以之前的路径也可以使用:

几点建议:
* 避免对@page后直接使用绝对路径
* 避免对@page后添加字面量
* 尽可能在@page后面添加路由参数,使得路由具有动态性
* 避免使用`AddPageRoute()`
在Razor Pages中用页面handlers来产生响应
page handler的任务有三个:确认传入的请求是合法的;调用相应的逻辑处理代码;选择合适的返回类型来返回。
page handler一般返回下面三种类型:
PageResult,返回HTMLVoid或Task同上面RedirectToPageResult转页面。
需要注意的是,page handler并不直接产生响应,而是选择响应的类型。
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace RazorTest.Pages
{
//[IgnoreAntiforgeryToken(Order = 1001)]
[IgnoreAntiforgeryToken]
public class TestCModel : PageModel
{
public void OnGet()
{
}
public void OnPost()
{
Console.WriteLine("This is Post");
}
public void OnPostJohnYang()
{
Console.WriteLine( "This is Post JohnYang");
}
}
}
@page "{handler?}"
@model RazorTest.Pages.TestCModel
@{
}


需要注意的是,这个demo需要忽略CSRF的防护。
ASP.NET Core之Razor Page相关的更多相关文章
- ASP.NET Core使用Razor页面
ASP.NET Core使用Razor页面 Razor是ASP.NET的页面引擎,在ASP.NET MVC 3以后被广泛使用,我在之前的博客中有所介绍,需要更多了解的朋友请移步[Razor语法] 在A ...
- 独立使用Asp.net Core 的razor模板 (一):Razor引擎的一些细节
由于最近需要写一些界面稍微好看点的Winform程序,如果用原生控件,,想要达到好看的程度,需要花费比较大的功夫,因为之前使用过CefSharp,因此发觉如果是使用CEF+Html的方式,界面可以相对 ...
- [译]ASP.NET Core揭秘 - Razor Pages
原文 什么是Razor Pages? Razor pages是ASP.NET Core 2.0的新特性,它被设计用来更快的开发页面,比传统的MVC模式更便捷. 创建项目 为了使用Razor Pages ...
- [asp.net core]The requested page cannot be accessed because the related configuration data for the page is invalid.
bug HTTP Error 500.19 - Internal Server Error The requested page cannot be accessed because the rela ...
- ASP.NET Core Restful Web API 相关资源索引
GraphQL 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(上) 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(下) [视频] 使用ASP.NET C ...
- 【APS.NET Core】- Razor Page 使用jqgrid实现分页功能
本文将使用jqgrid在Razor Page中实现分页功能. 前台 List.cshtml代码如下: @page @model ListModel @{ Layout = "~/Pages/ ...
- ASP.NET Core 如何使用Mvc相关技术建立Controller、Tag Helper (下)
上篇文章介绍了通过定义两个接口和服务类,分别实现这两个接口,并且进行了一个服务的注册. 今天就来建立Controller 接下来就是在控制器中通过构造函数的方式注入接口(见代码块6行) 代码块2行的意 ...
- asp.net core 的 razor pages 如何使用ajax调用后台方法
Razor 是一种允许您向网页中嵌入基于服务器的代码(Visual Basic 和 C#)的标记语法. 当网页被写入浏览器时,基于服务器的代码能够创建动态内容. 在网页加载时,服务器在向浏览器返回页面 ...
- Asp.Net Core Mvc Razor之RazorPage
在AspNetCore.Mvc.Razor命名空间中的RazorPage继承RazorPageBase,并定义的属性为: HttpContext Context 表示当前请求执行的HttpContex ...
- 从零开始实现ASP.NET Core MVC的插件式开发(八) - Razor视图相关问题及解决方案
标题:从零开始实现ASP.NET Core MVC的插件式开发(八) - Razor视图相关问题及解决方案 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun ...
随机推荐
- 纯离线部署本地知识库LLM大模型
纯离线部署本地知识库LLM大模型 一.下载离线大模型 下载的网址:https://hf-mirror.com/ deepseek qwen 相关的模型,只建议使用1.5B的,GGUF后缀的模型 推荐下 ...
- C#如何使用HttpClient对大文件进行断点上传和下载
什么是Http的断点上传和下载 断点上传:在向服务商上传大文件的时候,将一个大的文件拆分成多个小的文件,每个文件通过单独的Http请求上传给服务器. 断点下载:在向服务器请求下载一个大的资源文件的时候 ...
- 小程序和APP抓包的问题
小程序和APP抓包的问题 很多同学都会遇到小程序和APP抓不到包的问题,抓不到https请求包,这边给大家提供一些解决方案. Yakit工具 首先需要的就是一个抓包神器yakit,这个工具非常好用强大 ...
- BUUCTF---RSA4
题目 点击查看代码 N = 33131032421200003002021431224423222240014241042341310444114020300324300210433321420203 ...
- ANSYS 部件组装的注意事项
ANSYS 中部件的装配 ANSYS 也可以实现与 Abaqus 类似的组装功能,但是要注意装配过程中材料编号,单元编号,坐标系编号的变化 具体装配流程 1.组件的创建和保存 ! 1.组件开头设置 f ...
- Ink 和 TravisCI 更配哦
前言 去年还是前年,无意间接触到ink,看到是用go写的,非常小巧和精简,于是乎fork了下,还整了个供ink用的docker镜像``. 不过那时候热衷于折腾博客...结果也没折腾出什么来, 今天整理 ...
- Readers and Writers JSON Framework(2)
我们关心json的读写.特别在datasnap中,关于使用stream更是显得重要.其实轮子都帮你做好了,你不知道整经再研究就是一个悲哀.除非你要研究. 回正题: 处理json有二套框架. JSON ...
- 古老的BAT文件在windows下的编辑
直接上代码 rem echo choice /t 20 /d y /n >nul rem start/d "E:\service\exe" 8091.exe 8091 sta ...
- MQTT协议发布和订阅的实现,一步步带你实现发布订阅服务。
MQTT协议 MQTT协议是基于TCP传输协议之上的应用层协议,全程Message Queuing Telemetry Transport.主要用于物联网设备间的通信,在低带宽.不稳定网络环境下的优势 ...
- IDEA target中没有class文件/target中有class没有yml文件/yml文件不显示叶子
target中没有class文件.表现为文件显示红波浪线,但是点进去自己又好了,但是编译会说找不到.点进入target文件夹发现没有class文件,只有yml文件或者什么都没有 解决方法:rebuil ...