微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过ASP.NET Core MVC中的视图维持模型

如何解决通过ASP.NET Core MVC中的视图维持模型

如果我将Model传递给视图,是否有一种简便的方法将该模型通过视图上的表单传递给提交时的另一个控制器?

例如,从我的HomeController开始

public IActionResult Index()
{
    PersonModel pm = new PersonModel() { /* value assignment logic not important */ }
    return View(pm);
}

这会将PersonModel传递到Index视图:

@model Models.PersonModel

在此视图下,我希望form调用post方法

<form method="post" asp-controller="People" asp-action="Continue">

该post方法应该将传递给它的整个模型传递给People控制器Continue方法

我知道如何持久保存模型数据的唯一方法是使用输入(可见或隐藏)处理其所有属性

<form method="post" asp-controller="People" asp-action="Continue">
    <input asp-for="PersonId" hidden="hidden"/>
    <input asp-for="PersonName" hidden="hidden"/>
    ... etc ...
    <input type="submit" value="Go" />
</form>

但这对于大型模型来说有点烦人。

我想我可以为Model中的每个属性编写一个循环?但是我想知道是否有一种快捷方式,我不知道该在哪里写类似的东西

<form method="post" asp-controller="People" asp-model=@Model>

请忽略此示例的原因(这是非常少的)-我只是一厢情愿吗?

(另一种情况可能是我传递了List的{​​{1}},而我希望仅将列出的第一项传递给下一个控制器,而不必在页面上写入所有属性分配)

解决方法

我不知道这与在方法的[HttpGet]版本中填充视图模型并将其发布回其[HttpPost]版本有什么不同。只要模型与发布的内容匹配,模型绑定将自动为您将值绑定到模型中。

如果您的表单包含索引页面上具有可见输入或隐藏输入的PersonModel的所有属性,并且想要将模型发布到/people/continue,则唯一要做的就是在Continue中声明PeopleController动作以采用与参数相同的视图模型:

[HttpPost]
public IActionResult Continue(PersonModel vm)
{
    ...
}

在不知道您的用例或要完成的工作的情况下,这应该可以按您想要的方式工作(我自己不会那样做)。


根据您写的<form method="post" asp-controller="People" asp-model=@Model>,我想您正在寻找一种仅将模型标识带到另一页的方法吗?在这种情况下,您应该创建锚标记并仅使用项目ID生成URL,而不是使用表单:

foreach(var personModel in peopleModel)
{
    <a asp-action="continue" asp-controller="people" asp-route-id="@personModel.Id">
        Continue to edit
    </a>
}

然后,您需要定义[HttpGet]操作方法的Continue版本,该方法需要一个人员ID,在您的存储中查找该ID,并为您的Continue页面填充视图模型,就像您为索引填充PersonModel一样。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。