【问题标题】:ASP.Net Core Razor Pages: How to return the complex model on post?ASP.Net Core Razor Pages:如何在后期返回复杂模型?
【发布时间】:2018-07-16 21:35:09
【问题描述】:

我创建了一个新的 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() 时?

【问题讨论】:

    标签: asp.net-core razor-pages


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-29
      • 2020-02-19
      • 2018-10-31
      • 1970-01-01
      • 2020-10-04
      • 2020-11-21
      • 2018-03-30
      • 2020-02-03
      相关资源
      最近更新 更多