ASP.NET核心页面处理程序

vxqlmq5t  于 2023-06-25  发布在  .NET
关注(0)|答案(1)|浏览(125)

我的登录注册表单在同一页上。
在ASP.NET Core剃刀页面中,我有一个名为account的页面,其中有两个处理程序,一个是OnPostLogin用于登录,另一个是OnPostRegister用于新用户注册。
我在类级别定义了两个属性,loginModelregisterModel,这样我就可以用标签帮助器将表单输入连接到每个属性。在asp-page-handler中,我将每个表单都放置为自己的处理程序。当我想在代码中进行验证时,使用此代码。

if (ModelState.IsValid)

它从来都是无效的,并且总是因为其他表单条目而无效,即登录条目对注册无效(因为它们是空的),并且注册表单条目对登录也无效。
如何解决这个问题?
我打赌

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

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

gzszwxb4

gzszwxb41#

您可以将登录表单和注册表单分成两个不同的部分视图。这样,每个表单都将有自己的独立作用域和验证上下文。
下面是我基于这个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)
    {
        // ...
    }
}

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

相关问题