Asp.net core ASP.Net核心剃须刀页面:如何在post上返回复杂模型?

Asp.net core ASP.Net核心剃须刀页面:如何在post上返回复杂模型?,asp.net-core,razor-pages,Asp.net Core,Razor Pages,我创建了一个新的ASP.NETCore2(RazorPages)项目 我的模型是: public class FormularioGenerico { public FormularioGenerico() { } public string IP { get; set; } public List<string> items { get; set; } = new List<string>(); } 公共类Formular

我创建了一个新的ASP.NETCore2(RazorPages)项目

我的模型是:

public class FormularioGenerico
{
    public FormularioGenerico()
    {
    }

    public string IP { get; set; }

    public List<string> items { get; set; } = new List<string>();
} 
公共类FormularioGenerico
{
公共公式生成者()
{
}
公共字符串IP{get;set;}
公共列表项{get;set;}=new List();
} 
在我写的那页上 在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
    }
}
public类EditarModel:PageModel
{
[BindProperty]
公共公式生成程序ff{get;set;}
[BindProperty]
公共字符串消息{get;set;}
公共互联网
{
this.ff=新的FormularioGenerico();
ff.IP=“C#FORM”;
ff.添加项目(“OK1”);
ff.添加项目(“OK2”);
ff.添加项目(“OK3”);
}
公共异步任务OnPostAsync()
{
如果(!ModelState.IsValid)
{
返回页();
}
var m=ModelState.IsValid;//true
Debug.WriteLine(this.ff.IP);//始终返回null
Debug.WriteLine(this.ff.items.Count);//始终返回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>
@model Formulario.Pages.EditarModel
...
@Model.ff.IP
@foreach(模型ff项目中的var i)
{
@我
}
羡慕
项目输出正确。但是,完整的对象不会转到OnPost

问题是:模型没有在OnPost上完全填充


如何接收在OnGet上创建的完整对象,以及用户在表单上对OnPostAsync()所做的更改?

BindProperty属性用于通知ASP.NET Core表单提交的值应映射到指定的对象。在本例中,您设置了ff属性的值,但没有等效的输入值,因此ASP.NET Core将获取这些值,以便将它们存储回ff属性

为了使其正常工作,您必须将razor代码替换为以下代码:

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

@Model.ff.IP
@*为IP创建一个隐藏的输入*@
@对于(int i=0;i
非常重要。要实现此功能,您不能使用foreach循环,因为ASP.NET core将无法找到值。您必须使用for循环

我添加的输入是隐藏的,因为我猜您不希望它们可见,但您可以删除type=“hidden”,以便能够看到它们。您对这些输入所做的每个更改都将提交到OnPostAsync方法