【问题标题】:ASP.Net MVC - Sending an object from controller to view to controllerASP.Net MVC - 将对象从控制器发送到视图到控制器
【发布时间】:2010-07-21 20:50:00
【问题描述】:

我刚开始使用 ASP.Net MVC 2,可能做错了什么。我有一个控制器,它构建一些对象并使用 ViewData 将它们传递给视图。在视图中我显示数据等......然后想将相同的数据(加上其他用户输入)提交回同一个控制器。有什么简单的方法吗?

如有必要,我会提供更详细的问题描述。

谢谢,美好的一天:)

编辑: 我在 ViewModels 上阅读了更多内容,担心我没有正确使用它们,但显然它们不是解决方案。我的问题不是将数据获取到视图(我已经为此使用了视图模型),而是将数据返回给控制器。我使用复杂的对象,所以即使发送带有隐藏字段的表单也不是一个好的解决方案,因为它需要我序列化我的对象,这对于应该很简单的任务来说太麻烦了。我现在要看看会话。

编辑 2: 好的,我使用会话解决了这个问题,再简单不过了:)

【问题讨论】:

    标签: asp.net-mvc-2 view controller session session-state


    【解决方案1】:

    考虑以下任何一种解决方案来保持请求之间的状态:

    • 将该数据保存在 Session、Cache 或 cookie 中。选择将取决于数据是什么、数据在用户之间的可变性以及它的复杂程度。
    • 将这些项目写入隐藏输入。 Html.Hidden("foo", myData);

    如果您选择写入隐藏输入,请考虑faking ViewState。虽然这是一个非最佳解决方案。

    我更喜欢 Session 整体。没有篡改,你可以拿着复杂的物体。显然,Session 的缺点是未来的扩展性能、超时和多个会话的并发性。不过,其中一些问题很容易得到缓解。

    【讨论】:

    • 我会考虑使用会话,谢谢 :) 至于隐藏输入,它们可以使用不实现 ToString() 方法的东西吗?
    【解决方案2】:

    我有一个控制器来构建一些 对象并将它们传递给视图 使用 ViewData

    错误:定义一个视图模型类并使您的视图强类型化到这个模型,而不是使用ViewData

    一旦视图被渲染,您将拥有一个表单,并且您应该将返回所需的所有内容放入该表单中:用户将操作的可见输入字段和包含您想要获取的任何上下文的隐藏字段您发布到的操作。

    另一种选择是将此信息存储到 cookie 或会话中。

    【讨论】:

    • 实际上我正在使用视图模型,但我认为它们与我的问题无关(仍然认为它们是)。我已经在尝试使用隐藏输入来解决问题,但它们似乎没有正确传递我的对象。我觉得我在做一些非常错误的事情(也许这是一天的结束)但是当我将我的对象放在隐藏字段中时,只有类名被传递(作为字符串)。
    • 隐藏字段仅适用于简单类型,例如整数和字符串。对于复杂类型,您将需要序列化或下降到简单属性。
    【解决方案3】:

    查看视图模型的一些示例。 应该反对使用 ViewData 的东西。

    例如http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

    这样,您就处于整个链类型保存状态,并且您可以在回帖中将整个模型作为参数接收。

    【讨论】:

    • 哦,这很有趣,我想我并没有真正理解视图模型是如何工作的,并且没有以正确的方式使用它们。谢谢,这可能会解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多