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

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

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

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

有帮助吗?

解决方案

我认为你不能做你想做的事情,我收集的内容如下:

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

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

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

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

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

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

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

其他提示

我刚试过这个,似乎有效。也尝试了没有形式,它也工作。不确定这是否完全你想要的是什么。

<强>动作

[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")%>
        <input type=submit value=submit />
<% }%>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top