【发布时间】:2016-03-22 16:41:11
【问题描述】:
我在页面上有 3 个局部视图和 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