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,返回HTML
  • Void或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相关的更多相关文章

  1. ASP.NET Core使用Razor页面

    ASP.NET Core使用Razor页面 Razor是ASP.NET的页面引擎,在ASP.NET MVC 3以后被广泛使用,我在之前的博客中有所介绍,需要更多了解的朋友请移步[Razor语法] 在A ...

  2. 独立使用Asp.net Core 的razor模板 (一):Razor引擎的一些细节

    由于最近需要写一些界面稍微好看点的Winform程序,如果用原生控件,,想要达到好看的程度,需要花费比较大的功夫,因为之前使用过CefSharp,因此发觉如果是使用CEF+Html的方式,界面可以相对 ...

  3. [译]ASP.NET Core揭秘 - Razor Pages

    原文 什么是Razor Pages? Razor pages是ASP.NET Core 2.0的新特性,它被设计用来更快的开发页面,比传统的MVC模式更便捷. 创建项目 为了使用Razor Pages ...

  4. [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 ...

  5. ASP.NET Core Restful Web API 相关资源索引

    GraphQL 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(上) 使用ASP.NET Core开发GraphQL服务器 -- 预备知识(下) [视频] 使用ASP.NET C ...

  6. 【APS.NET Core】- Razor Page 使用jqgrid实现分页功能

    本文将使用jqgrid在Razor Page中实现分页功能. 前台 List.cshtml代码如下: @page @model ListModel @{ Layout = "~/Pages/ ...

  7. ASP.NET Core 如何使用Mvc相关技术建立Controller、Tag Helper (下)

    上篇文章介绍了通过定义两个接口和服务类,分别实现这两个接口,并且进行了一个服务的注册. 今天就来建立Controller 接下来就是在控制器中通过构造函数的方式注入接口(见代码块6行) 代码块2行的意 ...

  8. asp.net core 的 razor pages 如何使用ajax调用后台方法

    Razor 是一种允许您向网页中嵌入基于服务器的代码(Visual Basic 和 C#)的标记语法. 当网页被写入浏览器时,基于服务器的代码能够创建动态内容. 在网页加载时,服务器在向浏览器返回页面 ...

  9. Asp.Net Core Mvc Razor之RazorPage

    在AspNetCore.Mvc.Razor命名空间中的RazorPage继承RazorPageBase,并定义的属性为: HttpContext Context 表示当前请求执行的HttpContex ...

  10. 从零开始实现ASP.NET Core MVC的插件式开发(八) - Razor视图相关问题及解决方案

    标题:从零开始实现ASP.NET Core MVC的插件式开发(八) - Razor视图相关问题及解决方案 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun ...

随机推荐

  1. Mybatis 返回自增主键的id

    Mybatis 返回自增主键的idkeyProperty=id:封装到对象中的id字段当中keyColumn=id:封装到数据库的id这一列order=AFTER:在新增语句之后执行 方法一 < ...

  2. NebulaGraph Desktop 使用初体验

    前言 前两天 NebulaGraph 官方宣布了全新的开源 Desktop,旨在通过一体化方案解决图数据库部署复杂.工具碎片化.学习成本高等的痛点问题,我也是跃跃欲试.前期在初识 NebulaGrap ...

  3. 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能

    葡萄城 AI 搜索接入 DeepSeek 在软件开发的广阔领域中,信息获取的效率直接影响开发进程的快慢.葡萄城始终致力于为开发者打造高效.智能的开发环境.自去年12月上线以来,AI 搜索功能已在帮助开 ...

  4. Laravel11 从0开发 Swoole-Reverb 扩展包(一) - 扩展包开发

    前言 大家好呀,我是yangyang.好久没更新了,最近新项目在使用laravel11(截止目前发文,laravel12也发布了)做开发,自己也是利用有些空闲时间做些除开业务以外的深入学习,因此也就萌 ...

  5. 学习unigui【18】unidbgrid的GridsGroupingSorting

    折腾二天,你不按照demo里的代码来,就是没有效果.功力不够导致的.学习学习再学习!努力努力再努力! procedure TUniGridsGroupingSorting.UniDBGrid1Mult ...

  6. 2024睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛) RC-u5 工作安排详解

    本文参考 https://www.cnblogs.com/Kescholar/p/18306136 这一题可能对高手来说就能轻而易举的看出是个01背包,但是对于我这种小白还是要经过详细的分析才可以理解 ...

  7. 第五届新型功能材料国际会议(ICNFM 2025)

    第五届新型功能材料国际会议(ICNFM 2025) 2025年5月16日-17日 曼谷,泰国 http://www.icnfm.net/ 会议简介 第五届新型功能材料国际会议(ICNFM 2025)将 ...

  8. 单元测试——Mock RestTemplate

    service代码如下: public class TestServiceImpl implements ITestService { @Autowired RestTemplate restTemp ...

  9. 康谋分享 | aiSim5仿真场景重建感知置信度评估(三)

    aiSim5重建高精度的真实交通场景,用于测试和训练ADAS/AD系统.内置场景包括赛道.车库.高速公路和城市环境.通过全局行动日志,aiSim能将驾驶数据转化为场景重建.车道线检测算法在仿真与现实世 ...

  10. adb常见命令及日志

    一.adb介绍 1.adb(Android Debug Bridge)是android sdk的一个工具 2.adb是用来连接安卓设备和PC端的桥梁,用户可以通过adb在电脑上对手机进行一系列操作 3 ...