【问题标题】:How to access data from differnt partial view after POSTPOST后如何从不同的局部视图访问数据
【发布时间】:2016-03-22 16:41:11
【问题描述】:

我在页面上有 3 个局部视图和 3 个视图模型:

  1. 帐号列表
  2. 模态弹窗(您可以在此处修改多个帐户)
  3. 搜索面板

我想在 2 上执行 POST 后刷新 1。这很简单,但如果我想保留使用搜索面板后得到的结果怎么办?

我可以通过 2 种方式做到这一点,但似乎都不好(如果我错了,请纠正我)。

首先(我选择并工作的那个)是将 3. 中使用的视图模型存储在 TempData 中。我进行搜索(POST)并将传递的视图模型保存在 TempData 中。然后,每当我在不同的局部视图上进行 POST 时,我都可以刷新 1. 使用 TempData 中的数据(搜索参数)。

 private const string SearchDataKey = "SearchData";
    [HttpGet]
    public PartialViewResult RefreshData()
    {
        if (TempData[SearchDataKey] != null)
            return PartialView("AccountListView", PrepareAccountListViewModelForSearchData(TempData[SearchDataKey] as AccountSearchViewModel));
        else
            return PartialView("AccountListView", PrepareAccountListViewModel());
    }

并保存 ViewModel:

 public PartialViewResult Search(AccountSearchViewModel searchParameters)
    {
    ...
            TempData[SearchDataKey] = searchParameters;
            return PartialView("AccountListView", databaseAccountListViewModel);}

第二种方法是始终使用所有 3 个视图模型发布“大”视图模型。这样,我将获得来自 Search 的视图模型的数据,但我将发送许多不需要的信息,而只是发送我需要调用过程的 Modal Popup 的视图模型。

我问了几个有更好经验的 MVC 人,他们说他们从来不需要在 TempData 中存储视图模型,但它似乎仍然比拥有 1 个大表单并在每个 POST 中传递所有内容更合理。

你知道有什么更好的方法来处理这个问题或者哪种方法是正确的吗?

PS。主题具有“最佳实践”,但因警告消息而被删除。我希望在 SO 上仍然允许询问意见。

PS2。初始加载后我的大部分 POST 和 GET 都是通过 Ajax 进行的。

【问题讨论】:

  • 征求意见是题外话。并听取您更有经验的同事的意见(运行您的应用程序并按 F5 刷新浏览器,以了解您为什么不应该使用 TempData - 它只持续一个请求)
  • @StephenMuecke,在这种特殊情况下,F5 不是问题,因为我宁愿在那之后加载默认数据。另外,如果我选择第二种方法并发布所有内容,那么我相信在 F5 之后我仍然会丢失数据(因为我将重定向到 GET 闲置的 Post-redirect-get 模式)?所以要稍微改变一下问题,在每个 POST 中保持每页 1 个表单并传递 1 个大视图模型(带有部分视图的视图模型)有什么问题

标签: asp.net-mvc asp.net-mvc-4 viewmodel asp.net-mvc-partialview asp.net-mvc-viewmodel


【解决方案1】:

我做搜索(POST)

这在我看来在语义上是不正确的。 搜索 是一个不应修改服务器上任何状态的操作。所以使用GET 似乎更合适。并且当您使用 GET 时,您的好处是所有参数都已经存在于查询字符串中,因此在连续的 POST 操作(例如在您的情况下修改帐户)时保留。因此,您的 RefreshData 操作可以将 AccountSearchViewModel 作为参数,而模型绑定程序将负责其余的工作。

【讨论】:

  • 这完全有道理,但问题是我使用 AJAX 并使用 JQuery 仅刷新部分视图,因此仅刷新页面片段(因此我无法修改 QueryString 并且搜索数据是未保存)。除了查询字符串之外,保留搜索数据的唯一两种方法(我知道)是在每个 POST 中发送或保存在 TempData 中(这两种方法似乎都有问题)。
猜你喜欢
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
相关资源
最近更新 更多