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 ...
随机推荐
- Math.atan2求角度解析
我们求角度的时候, 第一反应应该是Math.tan(x/y)就得到角度了 但是这样求的是和y轴的夹角,如果以y轴正方向为0度,顺时针为正,则第三象限和第一象限的tan值一致,需要判断x,y和0的关系, ...
- Surpac 安装
修改config文件 share 文件进行整体替换 数字地质 环境配置问题总结 *http 报错! 块体生成数据暂停,点击生成验收量提交,报错生成失败!!! 解决方案:重新打开块体
- FastAPI 错误处理与自定义错误消息完全指南:构建健壮的 API 应用 🛠️
title: FastAPI 错误处理与自定义错误消息完全指南:构建健壮的 API 应用 ️ date: 2025/3/12 updated: 2025/3/12 author: cmdragon e ...
- 基于pandas的数据清洗 -- 缺失值(空值)的清洗
博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...
- Linux上安装配置InstantClient及64位系统Pl/SQL配置
1.首先到官网下载文件:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html?ssS ...
- MySQL-InnoDB行锁
InnoDB的锁类型 InnoDB存储引擎支持行锁,锁类型有两种: 共享锁(S锁) 排他锁(X锁) S和S不互斥,其他均互斥. 除了这两种锁以外,innodb还支持一种锁,叫做意向锁. 那么什么是意向 ...
- study Rust-4【所有权】这个太重要了!
由于Rust内存垃圾自动回收,那就得搞清楚这个所有权玩意.这个太重要了.因为关系到贯穿于你以后的程序编写. 几个概念: 一.移动 1.咱们一般语言,自己申请内存,自己管理和释放.就是new和free. ...
- FMM4在XE下使用
在project中增加 {$IFDEF DEBUG} ReportMemoryLeaksOnShutdown := True; {$ENDIF} 即可得到提示,如果内存有泄漏的话.但是想进一步仔细使用 ...
- 一文速通Python并行计算:06 Python多线程编程-基于队列进行通信
一文速通 Python 并行计算:06 Python 多线程编程-基于队列进行通信 摘要: 队列是一种线性数据结构,支持先进先出(FIFO)操作,常用于解耦生产者和消费者.慢速生产-快速消费场景中,队 ...
- 使用Python计算并可视化长直导线产生的磁场
引言 大家好,今天我们来探讨一个有趣的话题--长直导线产生的磁场,并通过 Python 来进行计算和可视化.你可能会问,为什么要研究这个问题?其实,这是电磁学中的一个基础问题,理解了它,我们就能更好地 ...