Asp.net core 2.1 当我在单个asp core 2.1 razor页面上编辑表单和创建新表单时,如何避免服务器端模型验证错误?

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" />

使用Asp Core 2.1 Razor pages构建单页应用程序。我的编辑和新功能在一个页面上

剃须刀页面:

@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();
        }
    }
}