我的登录和注册表格位于同一页面上。
在 ASP.NET Core Razor Pages 中,我有一个名为
account
的页面,其中有两个处理程序,一个是 OnPostLogin
用于登录,OnPostRegister
用于新用户注册。
我在类级别定义了两个属性,
loginModel
和registerModel
,以便我可以使用标签助手将表单输入连接到每个属性。在 asp-page-handler
中,我将每个表单放入其自己的处理程序中。当我想在代码中进行验证时,我使用以下代码:
if (ModelState.IsValid)
它永远不会有效,并且总是因为其他表单条目而无效,即登录条目对于注册无效(因为它们是空的)并且注册表单条目对于登录也无效。
如何解决问题?
我猜到了:
if (ModelState.IsValid)
{
// Register Or Login Action
}
我从代码中删除了它,并使用 jQuery 验证在客户端执行验证,但我也必须在服务器端执行此操作。
您可以将登录和注册表单分成两个不同的部分视图。这样,每个表单都会有自己独立的范围和验证上下文。
这是我基于此 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)
{
// ...
}
}
或者,为每个表单创建单独的页面。