Razor Pages如何合并仅传参不同的多个OnPost提交处理方法
合并Razor Pages多提交按钮处理逻辑的实现方法
表单提交时,只有用户实际点击的提交按钮的name和value会被携带到请求表单数据中,利用这个特性就可以把重复的处理逻辑合并到同一个OnPost方法中,不需要拆分多个命名handler。
- 首先修改前端表单:移除两个提交按钮上的
asp-page-handler特性,给两个按钮设置相同的name属性,用不同的value区分按钮身份。
如果直接用input做提交按钮,代码如下:
<form class="form" method="post"> <input type="submit" value="Test1" name="ClickedButton"/> <input type="submit" value="Test2" name="ClickedButton"/> </form>
如果不想让判断标识和按钮显示的文本耦合(比如后续修改按钮显示文案时不需要改动后台判断逻辑),可以用button标签实现,设置的value不会展示在前端页面:
<form class="form" method="post"> <button type="submit" name="ClickedButton" value="btn1">Test1</button> <button type="submit" name="ClickedButton" value="btn2">Test2</button> </form>
- 然后修改后台代码:删除原来的
OnPostButton1和OnPostButton2两个重复方法,统一实现一个OnPost方法,从表单数据中读取提交按钮对应的value,判断触发提交的按钮后选择对应参数传入即可:
public async Task<IActionResult> OnPost(IFormCollection data) { if (!ModelState.IsValid) { return Page(); } var clickedButton = data["ClickedButton"].ToString(); var param = clickedButton switch { "Test1" => param1, // 若使用button标签方案,此处判断值改为"btn1" "Test2" => param2, // 对应改为"btn2" _ => throw new InvalidOperationException("非法提交请求") }; await _db.InsertOrUpdateComments(param); return Redirect("/Projects/Index"); }
注意:原代码中方法签名缺少
async和Task返回值标记,但内部使用了await调用,直接运行会编译报错,上面的代码已经修正了这个问题。
内容的提问来源于stack exchange,提问作者Baldie47
相关产品推荐
相关产品推荐

