【发布时间】:2018-07-09 01:13:18
【问题描述】:
我正在使用带有 Razor 页面的 ASP.NET Core 2,并且我试图在一个页面上拥有两个具有不同属性 (BindProperty) 的表单。
@page
@model mfa.Web.Pages.TwoFormsModel
@{
Layout = null;
}
<form method="post">
<input asp-for="ProductName" />
<span asp-validation-for="ProductName" class="text-danger"></span>
<button type="submit" asp-page-handler="Product">Save product</button>
</form>
<form method="post">
<input asp-for="MakerName" />
<span asp-validation-for="MakerName" class="text-danger"></span>
<button type="submit" asp-page-handler="Maker">Save maker</button>
</form>
以及对应的PageModel:
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
namespace mfa.Web.Pages
{
public class TwoFormsModel : PageModel
{
[BindProperty]
[Required]
public string ProductName { get; set; }
[BindProperty]
[Required]
public string MakerName { get; set; }
public async Task<IActionResult> OnPostProductAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
return Page();
}
public async Task<IActionResult> OnPostMakerAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
return Page();
}
}
}
点击两个提交按钮中的任何一个都会让我进入相应的帖子处理程序。 “ProdutName”和“MakerName”都正确地填充了我在相应输入字段中键入的任何内容。到目前为止,一切顺利。
但是:ModelState.IsValid() 总是返回真——不管相应属性的值是否有值。即使两个属性都为空,ModelState.IsValid() 也为真。
另外:OnPostProductAsync() 应该只验证“ProductName”,因此 OnPostMakerAsync() 应该只验证“MakerName”。
这可以做到吗?还是我对 Razor Pages 的要求太多了?有很多博客和教程向您展示如何在一个页面上拥有两个表单……但它们都使用相同的模型。我需要不同的模型!
【问题讨论】:
-
您可以根据表单中的 asp-page-handler 属性非常简单地执行此操作。您可以在此处查看示例:youtube.com/watch?v=-6PE4p4gUYQ
-
2021,我们仍然没有很好的方法来做到这一点! WTF 微软?每页1个表格真的吗?如果我想在一页中有用户设置和应用程序设置的表单怎么办 - 我不能。我必须创建一些模型怪物,将所有值保留在那里等等..
-
我已经打开了一个与此github.com/dotnet/aspnetcore/issues/37606相关的问题
标签: c# asp.net-core-2.0 razor-pages