如何处理多个asp页面处理程序之间的冲突

问题描述 投票:0回答:1

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

在 ASP.NET Core Razor Pages 中,我有一个名为

account
的页面,其中有两个处理程序,一个是
OnPostLogin
用于登录,
OnPostRegister
用于新用户注册。

我在类级别定义了两个属性,

loginModel
registerModel
,以便我可以使用标签助手将表单输入连接到每个属性。在
asp-page-handler
中,我将每个表单放入其自己的处理程序中。当我想在代码中进行验证时,我使用以下代码:

if (ModelState.IsValid)

它永远不会有效,并且总是因为其他表单条目而无效,即登录条目对于注册无效(因为它们是空的)并且注册表单条目对于登录也无效。

如何解决问题?

我猜到了:

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

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

c# asp.net-core validation razor-pages
1个回答
0
投票

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

这是我基于此 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)
    {
        // ...
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.