ASP.NET 核心页面处理程序

ASP.NET Core Pages Handler

提问人:Unknown 提问时间:6/11/2023 最后编辑:marc_sUnknown 更新时间:6/11/2023 访问量:170

问:

我的登录注册表格在同一页面上。

在 ASP.NET Core razor 页面中,我有一个名为 的页面,其中有两个处理程序,一个用于登录和新用户注册。accountOnPostLoginOnPostRegister

我在类级别定义了两个属性,以及 ,以便我可以使用标记帮助程序将表单输入连接到每个属性。在 中,我将每个表单都放在自己的处理程序中。当我想在代码中进行验证时,请使用此代码。loginModelregisterModelasp-page-handler

if (ModelState.IsValid)

它从无效,并且由于其他表单条目而始终无效,也就是说,登录条目对注册无效(因为它们是空的),并且注册表单条目对登录也无效。

如何解决问题?

我敢打赌

if (ModelState.IsValid)
{
    // Register Or Login Action 
}

我从代码中删除了它,并使用jQuery验证在客户端执行了验证,但我也必须在服务器端执行此操作。

C# asp.net ASP.Net-Core 验证 Razor-Pages

评论

0赞 Qing Guo 6/13/2023
请显示您尝试过的尝试以及您从尝试中获得的问题/错误消息。比如你的两个处理程序是什么样子的,ModelState的错误是什么?

答:

0赞 Mike Brind 6/11/2023 #1

您可以将登录窗体和注册窗体分成两个不同的分部视图。这样,每个表单都将有其自己的独立范围和验证上下文。

这是我基于这个PageModel的工作演示:

public class RegisterOrLoginModel : PageModel
{
    public class RegisterModel
    {
        [Required]
        public string UserName { get; set; }
        [Required]
        public string Password { get; set; }
    }
    public class LoginModel
    {
        [Required]
        public string UserName { get; set; }
        [Required]
        public string Password { get; set; }
    }
}

下面是演示如何将相关类传递给其指令的部分:@model

_RegisterPartial.cshtml

@model RegisterOrLoginModel.RegisterModel
<h4>Register</h4>
<form method="post" asp-page-handler="Register">
    <input asp-for="UserName" /><br />
    <input asp-for="Password" /><br />
    <button>Submit</button>
</form>

_LoginPartial.cshtml

@model RegisterOrLoginModel.LoginModel
<h4>Log In</h4>
<form method="post" asp-page-handler="Login">
    <input asp-for="UserName" /><br />
    <input asp-for="Password" /><br />
    <button>Submit</button>
</form>

在 Razor 页面中包括两个部分,如下所示:

<partial name="_LoginPartial" model="new RegisterOrLoginModel.LoginModel()" />
<partial name="_RegisterPartial" model="new RegisterOrLoginModel.RegisterModel()" />

然后,不要在 PageModel 中有两个绑定属性,而是更新处理程序以将相应的模型作为参数。然后将只使用参数,不会受到其他东西的影响:ModelState

public void OnPostRegister(RegisterModel model)
{
    if(ModelState.IsValid)
    {
        // ...
    }
}
public void OnPostLogin(LoginModel model)
{
    if (ModelState.IsValid)
    {
        // ...
    }
}

或者,为每个表单创建单独的页面。