我创建了一个新的ASP.Net Core 2(Razor Pages)项目
我的模特是:
public class FormularioGenerico
{
public FormularioGenerico()
{
}
public string IP { get; set; }
public List<string> items { get; set; } = new List<string>();
}
在我放的页面上 在page.cshtml.cs上
public class EditarModel : PageModel
{
[BindProperty]
public FormularioGenerico ff { get; set; }
[BindProperty]
public string Message { get; set; }
public void OnGet()
{
this.ff = new FormularioGenerico();
ff.IP = "C# FORM";
ff.items.Add("OK1");
ff.items.Add("OK2");
ff.items.Add("OK3");
}
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
var m = ModelState.IsValid; // true
Debug.WriteLine(this.ff.IP); // is Always returning null
Debug.WriteLine(this.ff.items.Count); // is Always returning null
}
}
page.cshtml上的:
@model Formulario.Pages.EditarModel
...
<h1>@Model.ff.IP</h1>
@foreach (var i in Model.ff.items)
{
<div>@i</div>
}
<button type="submit">Enviar</button>
正确输出项目。但完整的对象不会转到OnPost。
问题是:该模型未完全填充在OnPost上。
如何接收在OnGet上创建的完整对象,以及用户在表单上对OnPostAsync()发布的更改?
答案 0 :(得分:3)
BindProperty属性用于通知ASP.NET Core,表单提交的值应该映射到指定的对象。在您的情况下,您设置了ff属性的值,但是您没有等效的输入值,因此ASP.NET Core将获取这些值,以便将它们存储回ff属性。
为了使其正常工作,您必须使用以下代码替换剃刀代码:
<form method="post">
<h1>@Model.ff.IP</h1>
<input asp-for="@Model.ff.IP" type="hidden" /> @* create a hidden input for the IP *@
@for (int i = 0; i < Model.ff.items.Count(); i++)
{
<input asp-for="@Model.ff.items[i]" type="hidden" /> @* create a hidden input for each item in your list *@
<div>@Model.ff.items[i]</div>
}
<button type="submit">Enviar</button>
</form>
非常重要。要使其工作,您不能使用foreach循环,因为ASP.NET核心将无法找到值。你将不得不使用for循环。
我添加的输入是隐藏的,因为我猜你不希望它们可见,但你可以删除type =“hidden”,这样你就可以看到它们。您对这些输入所做的每个更改都将提交给OnPostAsync方法。