Asp.Net Core 3中MVC视图路由至Razor Page动作未触发问题
问题诊断与解决方案
1. 为什么OnGetWithEmail没有被触发?
你当前的表单把asp-area、asp-page和asp-page-handler放在了submit按钮上,但submit按钮的这些属性不会修改表单的action地址。表单会默认提交到当前页面的URL,所以生成的URL里没有handler=WithEmail参数,Razor Pages也就无法匹配到OnGetWithEmail方法。
2. 修复表单提交目标
把区域、页面和处理器的标签助手移到<form>标签上,这样表单会正确生成指向Register页面WithEmail处理器的action:
<form class="form-inline push-10" method="get" asp-area="Identity" asp-page="/Account/Register" asp-page-handler="WithEmail"> <div class="form-group"> <label class="sr-only text-white" asp-for="Email">Email Address</label> <input class="form-control" type="email" asp-for="Email" placeholder="Your Email.."> </div> <div class="form-group"> <button class="btn btn-default" type="submit"> <i class="fa fa-plus"></i> Register </button> </div> <div class="form-group"> <a class="btn btn-default" asp-controller="Home" asp-action="Index"> <i class="fa fa-home"></i> Home </a> </div> </form>
修改后,提交表单时生成的URL会包含handler=WithEmail参数:https://localhost:44367/Identity/Account/Register?handler=WithEmail&Email=testemail@mydomain.com,这样OnGetWithEmail方法就会被正确触发。
3. 调整Register页面的处理器逻辑
你原来的OnGetWithEmail方法使用了重定向,这会导致浏览器发起新的请求,丢失原本的邮箱参数(除非手动传递)。更高效的方式是直接填充InputModel并返回页面:
public IActionResult OnGetWithEmail(string email) { if (!string.IsNullOrEmpty(email)) { // 假设你的Register页面已经定义了Input属性 Input = new InputModel { Email = email }; } return Page(); }
如果你坚持要使用重定向,需要在重定向时传递邮箱参数,然后在默认的OnGet方法中接收并填充:
// OnGetWithEmail方法 public IActionResult OnGetWithEmail(string email) { return RedirectToPage("Register", new { email = email }); } // Register页面的默认OnGet方法 public IActionResult OnGet(string email = null) { if (!string.IsNullOrEmpty(email)) { Input = new InputModel { Email = email }; } return Page(); }
4. 确保视图绑定正确
最后确认Register页面的邮箱输入框是绑定到Input.Email的,这样值才会自动填充:
<input asp-for="Input.Email" class="form-control" />
这样操作后,用户输入邮箱点击注册,就能正确触发OnGetWithEmail方法,并且注册页面的邮箱输入框会自动填充用户输入的地址。
内容的提问来源于stack exchange,提问作者dinotom
相关产品推荐
相关产品推荐

