ASP.NET Core Razor Pages – Handler Methods

2021-04-02  乐帮网

razor pages netcore

新建一个ASP.NET Core Razor Pages项目,我们看到在.cshtml– .cshtml.cs文件拥有代码和模型。Razor页面处理方法和请求都来自.cshtml文件。
首先看一下它的命名约定,大概如下:

 OnGet
 OnPost
 OnGetAsync
 OnPostAsync
 OnPostRemoveAsync
 OnGetAddAsync

从列表中,我们可以看到这些名称遵循特定的模式。它们都以On开头,然后是Get或Post,然后是可选的处理程序名称(Remove,Add),最后我们可以添加方法的Async后缀。
以Index.cshtml - Index.cshtml.cs为例进行介绍

(1)默认的GET处理程序
后台方法名: OnGet 也可以是 OnGetAsync ,也可以有返回值,也可以是void,写成void,这样它实际上还是返回Index.cshtml页面。

public void OnGet(){}
public void OnGetAsync(){}
 public IActionResult OnGet() { return Page(); }

以上的方法效果相同,当有返回值IActionResult时可以指定像返回 Page,像不像极了 MVC中的View ,对了就是这个感觉。当无返回时(void),它实际是返回 Index.cshtml。
但是记录,上面的方法不能同时存在,只能选择一种,不然会匹配到多个方法,导致错误。InvalidOperationException: Multiple handlers matched. The following handlers matched route data and had all constraints satisfied:

(2)默认的POST和GET处理程序
后台方法名:OnPost   也可以是  OnPostAsync  ,返回值解释同上。

  public IActionResult OnPostAsync() {}
  public IActionResult OnPost() { }

示例如下:

<div class="row">
    <div class="col-sm-3">
        @if (string.IsNullOrEmpty(Model.Name))
        {
            <form method="post">
                <div class="form-group">
                    <label for="name">姓名</label>
                    <input type="text" class="form-control" maxlength="20" id="name" name="name" />
                </div>

                <button type="submit" class="btn btn-primary">提交</button>
            </form>
        }
        else
        {
            <p>My name is @Model.Name</p>
        }
    </div>
</div>

后台方法:

 public IActionResult OnPost(string name) 
        {
            Name = name;
            return Page();
        }

下面我们的主角登场。在Inderx.cshml.cs里写多个方法,这里方法是指Post方法,写Get无意义,它是随html页面存在的。

(3)自定义Post实现

public IActionResult OnPostPrivacy(string name)
        {
            Name = name;
            return Page();
        }
  <form method="post">
                <div class="form-group">
                    <label for="name2">姓名</label>
                    <input type="text" class="form-control" maxlength="20" id="name2" name="name" />
                </div>

                <button type="submit" asp-page-handler="Privacy" class="btn btn-primary">提交</button>
            </form>

(4)高级用法,使用参数

  <form method="post" asp-action="Search" asp-controller="Index" >
            <div class="form-group">
                <label for="name3">姓名</label>
                <input type="text" class="form-control" maxlength="20" id="name3" name="name" />
            </div>
            <button class="btn btn-primary">提交</button>
        </form>
   public IActionResult OnPostSearch(string name)
        {
            Name = name;
            return Page();
        }

是不是很酷?你也可以直接写成<form method="post" action="./Index?handler=Search" >

看完以上示例是不是对Razor Pages有了底气,它已经很简单了。我提供我写的demo下载,可以参考下。

链接:https://pan.baidu.com/s/1RcnTskaxudUKPsGMI3aU_g 
 

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力