【问题标题】:Passing ViewModel in ASP.Net MVC from a View to a different View using Get使用 Get 将 ASP.Net MVC 中的 ViewModel 从一个视图传递到另一个视图
【发布时间】:2009-09-17 22:07:10
【问题描述】:

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

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

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

我可以在将自定义 ViewModel 发布回同一页面等时使其重新水化,但是如何在不使用 ModelBinder 的情况下使用 GET 到另一个 View 并将 ViewModel 放入控制器操作中,并且只需放置 ViewModel对象作为目标Action方法中的参数?

【问题讨论】:

    标签: c# asp.net-mvc viewmodel


    【解决方案1】:

    我不认为你可以做你想做的事,据我收集如下:

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

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

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

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

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

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

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

    【讨论】:

    • 是的,我已经尝试过这样的事情,即将强类型视图模型位传递给同一控制器上的 GET ActionLink,但不同的操作具有与类型和名称都匹配 actionlink 参数的参数。但是,这总是在 Action 中返回一个空参数,这就是我使用 QueryString 方法的原因。我认为它会受到默认模型绑定器的约束。注意:我假设在 MVC 1.0 中配置了默认模型绑定器,因为我看不到教程中显示的 ComplexModelBinder
    • 实际上只是找到了defaultModelBinder,所以请忽略最后一条评论的结尾。打算用现在配置的默认值试试这个
    • 是的,我可以看到,在进入目标 Action 时,我有一个实例化参数 ok,但是,这些值没有反映到其中。
    • @Redeemed1:你的操作方法是什么样的(你链接的那个)
    • 目标Action签名是public ActionResult Details(ProjectUIPViewModel projectUIPViewModel, int id, int? TransactionPage, int? SubProjectsPage, int? ActiveAccordion) 并且第一个Parameter有一个ModelBinder。进一步思考后,我决定尝试使用 POST 回到最初呈现视图的原始方法,然后尝试从那里尝试 RedirectToAction,这对我有用,从搜索操作到列表操作
    【解决方案2】:

    我刚试过这个,它似乎工作。还尝试了没有表格的情况,它也有效。不确定这是否正是您想要的。

    动作

    [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 />
    <% }%>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多