TypechoJoeTheme

香草物语

统计
登录
用户名
密码
/
注册
用户名
邮箱
输入密码
确认密码
文章目录

ASP.NET Core Razor 页面路由

Laughing博主
2017-09-04
/
0 评论
/
1,326 阅读
/
693 个字
/
百度已收录
09/04
本文最后更新于2021年04月27日,已超过1097天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

在服务器端 Web 应用程序框架中,其中非常重要的设计是开发人员如何将URL与服务器上的资源进行匹配,以便正确的处理请求。最简单的方法是将 URL 映射到磁盘上的物理文件,在 Razor 页面框架中,ASP.NET团队就是这样实现的。

关于 Razor 页面框架如何将 URL 与文件相匹配,有一些规则您必须了解,以及如何根据需要自定义规则改变输出的结果。如果您将 Razor 页面与 Web Form 框架进行比较,您还需要了解取代的 Url参数以及在URL中传递数据的机制。

规则一,Razor 页面需要一个根目录。默认情况下,该根目录是 Pages,位于Web应用程序项目的根目录中。您可以在Startup类的ConfigureServices方法中配置其它文件夹作为根目录。以下是将根目录更改为位于应用程序 “Content” 文件夹:

public void ConfigureServices(IServiceCollection services)  
    {   
        services   
            .AddMvc().   
            AddRazorPagesOptions(options => {   
                options.RootDirectory = "/Content";  
         });   
    }

规则二,URL映射到Razor页面,URL不包含文件扩展名。

规则三,“Index.cshtml”是一个默认文档,这意味着如果URL中缺少文件名,该请求将被映射到指定文件夹中的“Index.cshtml”。

URL传递参数

就像大多数其它框架一样,参数可以作为查询字符串在 URL 中传递,例如:www.domain.com/product?id=1;或者,您可以将其作为路由参数传递,因此上述示例将变为www.domain.com/product/1。URL的一部分必须映射到参数名称,在页面的路由模板来实现的,@page指令的一部分:

@page "{id:int}"

该模板告诉框架将页面名称之后URL的第一段作为“id”的路由参数。您可以通过多种方式访问路由参数的值。第一个是使用RouteData字典:

@page "{id}"  
{  
    var productId = RouteData.Values["id"];  
}

或者,您可以向该页面的OnGet()方法添加与路由参数相同名称的参数,并将其值分配给公共属性:

@page "{id}"  
@{  
    @functions{  
  
        public int Id { get; set; }  
  
        public void OnGet(int id)  
        {  
            Id = id;  
        }  
    }  
}  
<p>The Id is @Id</p>

如果您使用的是PageModel,那么是这样实现的:

using Microsoft.AspNetCore.Mvc.RazorPages;  
  
namespace RazorPages.Pages  
{  
    public class ProductModel : PageModel  
    {  
        public int Id { get; set; }  
        public void OnGet(int id)  
        {  
            Id = id;  
        }  
    }  
}  
@page "{id}"  
@model  ProductModel  
<p>The Id is @Model.Id</p>

最后,您可以在公有属性使用BindProperty特性,并省略该OnGet方法中的参数。Razor 文件内容保持不变,但是PageModel代码略有更改:

using Microsoft.AspNetCore.Mvc.RazorPages;  
  
namespace RazorPages.Pages  
{  
    public class ProductModel : PageModel  
    {  
        [BindProperty(SupportsGet = true)]  
        public int Id { get; set; }  
        public void OnGet()  
        {  
        }  
    }  
}

约束
此外,在此示例中参数的约束是它必须有一个值。URL www.domain.com/product/apple与www.domain.com/product/21一样有效,都是可以与路由匹配。如果您希望id值为整数,则可以通过将数据类型添加到模板来指定约束:

@page "{id:int}"

现在,如果您尝试通过“apple”作为参数值,应用程序将返回404 Not Found状态码。

您可以指定值不是必需的,可以将参数设置为可为空类型:

@page "{id:int?}"
如果您的应用程序允许使用“apple”作为参数值,则可以指定只允许使用A-Z和a-z的字符:

@page "{id:alpha}"
您可以与最小长度要求相结合:

@page "{id:alpha:minlength(4)}"
更多的约束信息,可以查看[url href='https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing#route-constraint-reference']微软文档[/url]

asp.netdotnetasp.net core
朗读
赞(3)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

香草物语

本文链接:

https://www.xiangcaowuyu.net/java/asp-net-core-routing-razor-page.html(转载时请注明本文出处及文章链接)

评论 (0)
  1. perry 闲逛
    MacOS · Safari

    [囧] [偷笑] [疑问]

    2018-07-11 回复
  2. qzqzqzqz 闲逛
    MacOS · Safari

    111111试试

    2018-01-19 回复