首页 > 解决方案 > 模型属性未传递到下一个视图

问题描述

我正在尝试在 asp.net mvc 的不同视图中重用模型。但是如果模型被传递到下一个视图并提交了新属性,那么旧值就会丢失。

这是我正在使用的代码示例:

模型

    public class ExampleModel
    {
        public string Attribut1 { get; set; }
        public string Attribut2 { get; set; }
    }

控制器

    public class HomeController : Controller
    {
        public IActionResult Page1()
        {
            return View(new ExampleModel());
        }

        public IActionResult Page1Check(ExampleModel model)
        {
            return View("Page2", model);
        }

        public IActionResult Page2Check(ExampleModel model)
        {
            return View("Page2", model);
        }
    }

视图1

@model Example.Models.ExampleModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

    <form asp-controller="Home" asp-action="Page1Check">
        <label asp-for="Attribut1"></label>
        <input asp-for="Attribut1" placeholder="Attribut1" />
        <button type="submit">Submit</button>
    </form>

视图2

@model Example.Models.ExampleModel
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

    <form asp-controller="Home" asp-action="Page2Check">
        <label asp-for="Attribut2"></label>
        <input asp-for="Attribut2" placeholder="Attribut2" />
        <button type="submit">Submit</button>
    </form>

如果我打开 Page1 会创建一个新模型。如果在Page1中输入了attribut1并提交了Page1Check,则调用并填充了attribut1。现在模型被传递到 page2。在这里,attribut2 被填写并提交。但是,如果我检查 Page2Check 内部的模型,则 attribut1 为空,并且仅填充了 attribut2。

奇怪的是,如果我检查 page2 视图中的属性 1,它仍然存在。只有在提交之后,attribut1 才消失。

我错过了什么,如何防止提交后填充的属性为空?

标签: c#asp.netmodel-view-controller

解决方案


为了在提交相应的表单时将一条数据从用户的浏览器发送到服务器,它必须包含在将发送到服务器的 HTML 元素中(例如 an<input>或 a <select>)。

在您的第一个视图中,您有一个 forAttribut1但不是 for的输入Attribut2,因此Attribut2当提交视图 1 中的表单时,它不会成为发送到服务器的数据的一部分。Attribut1在视图 2 中也是如此。

为了解决这个问题,您可以向<form>标签包含的每个视图添加隐藏字段来存储数据:

  • 对于视图 1,添加<input type="hidden" asp-for="Attribut2" />.
  • 对于视图 2,添加<input type="hidden" asp-for="Attribut1" />.

例如,视图 1 的表单现在如下所示:

<form asp-controller="Home" asp-action="Page1Check">
    <label asp-for="Attribut1"></label>
    <input asp-for="Attribut1" placeholder="Attribut1" />
    <input type="hidden" asp-for="Attribut2" />
    <button type="submit">Submit</button>
</form>

推荐阅读