Asp.net core 2.1 当我在单个asp core 2.1 razor页面上编辑表单和创建新表单时,如何避免服务器端模型验证错误?
使用Asp Core 2.1 Razor pages构建单页应用程序。我的编辑和新功能在一个页面上 剃须刀页面:Asp.net core 2.1 当我在单个asp core 2.1 razor页面上编辑表单和创建新表单时,如何避免服务器端模型验证错误?,asp.net-core-2.1,razor-pages,Asp.net Core 2.1,Razor Pages,使用Asp Core 2.1 Razor pages构建单页应用程序。我的编辑和新功能在一个页面上 剃须刀页面: @page @model EditNewTestModel @{ <div> <form method="post"> <input asp-for="NewXyz.Title" /> <input asp-for="NewXyz.Description" />
@page
@model EditNewTestModel
@{
<div>
<form method="post">
<input asp-for="NewXyz.Title" />
<input asp-for="NewXyz.Description" />
<input asp-for="NewXyz.PropertyA" />
<input asp-for="NewXyz.PropertyB" />
<button>Submit New</button>
</form>
</div>
<div>
<form method="post">
<input asp-for="EditXyz.Title" />
<input asp-for="EditXyz.Description" />
<input asp-for="EditXyz.PropertyA" />
<input asp-for="EditXyz.PropertyB" />
<button>Submit Edit</button>
</form>
</div>
}
最后是razor页面的.cs:
namespace razorpageTest.Pages
{
public class EditNewTestModel : PageModel
{
public void OnGet()
{
}
[BindProperty]
public FormXyz NewXyz { get; set; }
[BindProperty]
public FormXyz EditXyz { get; set; }
public IActionResult OnPost()
{
if (ModelState.IsValid)
{
var a = NewXyz;
}
return Page();
}
}
}
我遇到的问题是,当我提交“新”表单时,ModelState.IsValid为false,因为出于某种原因,标题和描述字段被预先添加到键列表中,如下面的屏幕截图所示。即使未提交,它们的值也显示为null。作为测试,我在编辑字段中输入了值,并且键仍然为空。当我从“编辑”属性中删除BindProperty属性时,不会发布额外的属性,但我失去了编辑功能
如果编辑模型和新模型的属性相同,只需将一个
FormXyz
属性绑定到页面,然后发布到不同的处理程序,或者检查key属性是否有值。如果是,则表示您正在编辑现有项。如果没有,您将创建一个新的
目前,两个FormXyz
属性都参与了模型绑定。一个未填充(本例中为EditXyz属性),因此其属性以默认值结束。字符串默认为null,但它们是必需的,因此它们会被添加到ModelState字典错误中。Ints默认为0,因此它们将有一个值并通过Required
测试。通过将PropertyA
null设置为空来检查这一点,最终也会将其添加到错误中
或者只创建一个页面用于创建,另一个页面用于编辑以减少混淆。如果编辑和新模型的属性相同,只需将一个
FormXyz
属性绑定到页面,然后发布到不同的处理程序,或者检查键属性是否有值。如果是,则表示您正在编辑现有项。如果没有,您将创建一个新的
目前,两个FormXyz
属性都参与了模型绑定。一个未填充(本例中为EditXyz属性),因此其属性以默认值结束。字符串默认为null,但它们是必需的,因此它们会被添加到ModelState字典错误中。Ints默认为0,因此它们将有一个值并通过Required
测试。通过将PropertyA
null设置为空来检查这一点,最终也会将其添加到错误中
或者只创建一个页面用于创建,另一个页面用于编辑,以减少混乱
namespace razorpageTest.Pages
{
public class EditNewTestModel : PageModel
{
public void OnGet()
{
}
[BindProperty]
public FormXyz NewXyz { get; set; }
[BindProperty]
public FormXyz EditXyz { get; set; }
public IActionResult OnPost()
{
if (ModelState.IsValid)
{
var a = NewXyz;
}
return Page();
}
}
}