C# 在ASP.NET核心MVC中通过视图维护模型

C# 在ASP.NET核心MVC中通过视图维护模型,c#,asp.net-mvc,asp.net-core,C#,Asp.net Mvc,Asp.net Core,如果我将模型传递给视图,是否有一种简单的方法可以在提交时通过视图上的表单将该模型传递给另一个控制器 例如,从myHomeController开始: public IActionResult Index() { PersonModel pm = new PersonModel() { /* value assignment logic not important */ } return View(pm); } 将PersonModel传递到索引视图: @model Models.

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

例如,从my
HomeController开始:

public IActionResult Index()
{
    PersonModel pm = new PersonModel() { /* value assignment logic not important */ }
    return View(pm);
}
PersonModel
传递到
索引
视图:

@model Models.PersonModel
在这个视图中,我需要一个
表单
来调用
post
方法:

<form method="post" asp-controller="People" asp-action="Continue">
但这对于大型模型来说有点烦人

我想我可以为
模型中的每个属性编写一个循环?但我想知道是否有一条捷径,我不知道在哪里可以写这样的东西

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

请忽略这个例子的原因(它非常简单)-我只是一厢情愿吗


(另一种情况可能类似于我传递
PersonModel的
列表
,我只希望将该列表的第一项传递给下一个控制器,而不必在页面上写入所有属性分配)

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

如果您的表单包含
PersonModel
的所有属性,并且在索引页上有可见或隐藏的输入,并且希望将模型发布到
/people/continue
,您只需在
PeopleController
中声明
Continue
操作,以采用与参数相同的视图模型:

[HttpPost]
公共IActionResult Continue(PersonModel vm)
{
...
}
在不知道您在这方面的用例或者您试图完成什么的情况下,这应该按照您想要的方式工作(我自己就是不会这样做)


从你写的
,我猜你在寻找一种方法,将模型的标识带到另一页?如果是这种情况,您应该创建锚定标记,而不是表单,并仅使用项目ID生成URL:

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

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

两个选项:1)缓存或存储在会话或数据库中;2) 将模型保留为JSON,然后在不重建表单的情况下重新发布。实际上,我可以将信息临时存储在数据库中,如果我可以缓存它,效果会更好。我不知道如何在asp net core mvc设置中实现这一点。感谢David的回答,但这并不是我想要的。我不想只保留模型中的一个值(例如,
id
),我想要一些速记来传递整个模型。我没有也不想创建一个具有所有属性的表单,这正是我希望避免的-我知道这对很多人来说可能没有多大用处(因为值不会改变),但通过我的
ViewComponent
s和搜索机制的组合,这将对我有很大帮助。我想我只需要编写一个类来循环遍历属性并创建所需的html。
foreach(var personModel in peopleModel)
{
    <a asp-action="continue" asp-controller="people" asp-route-id="@personModel.Id">
        Continue to edit
    </a>
}