使用Get将ASP.Net MVC中的ViewModel从View传递到另一个View

我有一个列表视图,它有一个强类型的ViewModel,它包含我正在使用的实体列表以及我正在携带的其他会话类型的东西。

单击列表中的项目(Html.ActionLink)转到“详细信息”视图时,我可以轻松传递实体ID。 但我也希望从View中传递ViewModel的其余部分。

我可以使用各种QueryString参数构建ActionLink,然后自定义ModelBinder可以拾取它们并再次为我提供ViewModel对象。 但是,我不喜欢这个。

我可以让自定义ViewModel在POST回到同一页面等时重新水化,但是如何在不使用ModelBinder的情况下使用GET将ViewModel转换为另一个View的Controller Action,只需将ViewModel对象放置为目标Action方法中的参数?

我不认为你可以做你想做的事,从我收集到的是以下内容:

  1. 在渲染List操作时,您希望创建指向另一个操作的链接(可能在另一个控制器上,但这不是关键)

  2. 触发此操作时,应该可以访问首次执行ActionLink方法时存在的原始ViewModel。

不幸的是,项目#1和#2彼此完全断开连接,因此没有真正的机制将当前ViewModel传递给将在不同会话中执行的链接。

当然,这并不是说没有解决方法:

您可以像这样生成操作链接:

<%= Html.ActionLink( "Label", "Action", "Controller", new {Parameter1 = Model.Data1, Parameter2 = Model.Data2}, null ) %> 

在链接的操作方法中,您可以使用传递给该操作方法的参数来实例化ViewModel。

我刚试过这个,它似乎工作。 也尝试了没有forms,它也工作。 不确定这是否正是你想要的。

行动

 [AcceptVerbs(HttpVerbs.Get)] public ActionResult Index(TestModel model) { ViewData["Message"] = model.Test1; return View(); } 

模型

 public class TestModel { public string Test1 { get; set; } public string Test2 { get; set; } } 

视图

 <% using (Html.BeginForm("Index","Home",FormMethod.Get)) { %> <%=Html.TextBox("Test1")%> <%=Html.TextBox("Test2")%>  <% }%>