ASP.Net Core Razor页面:如何在帖子上返回复杂模型?

时间:2018-02-06 18:21:02

标签: asp.net-core razor-pages

我创建了一个新的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()发布的更改?

1 个答案:

答案 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方法。