>我有 3 个部分视图,页面上有 3 个视图模型:
- 帐户列表
- 模式弹出窗口(您可以在此处修改多个帐户)
- 搜索面板
我想刷新 1. 在 2 上开机自检后。这很简单,但是如果我想保留使用搜索面板后获得的结果怎么办?
我可以通过两种方式做到这一点,但这两种方式似乎都很糟糕(如果我错了,请纠正我)。
首先(我选择并工作的那个)是存储 3. 中使用的视图模型。 在 TempData 中。我进行搜索(POST)并将传递的视图模型保存在TempData中。然后每当我在不同的部分视图上开机自检时,我都可以刷新 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());
}
并保存视图模型:
public PartialViewResult Search(AccountSearchViewModel searchParameters)
{
...
TempData[SearchDataKey] = searchParameters;
return PartialView("AccountListView", databaseAccountListViewModel);}
第二种方法是始终使用所有 3 个视图模型发布"大"视图模型。这样,我将从搜索的视图模型中获得数据,但我会发送许多不需要的信息,而不仅仅是我需要调用过程的模式弹出窗口的视图模型。
我问了一些经验更好的 MVC 人员,他们说他们永远不必在 TempData 中存储视图模型,但这似乎仍然比拥有 1 个大表单并在每个 POST 中传递所有内容更合理。
您知道处理此问题的更好方法或哪种方法是正确的吗?
主题具有"最佳实践",但由于警告消息而被删除。我希望在SO上仍然允许询问意见。
PS2.初始加载后,我的大多数 POST 和 GET 都是通过 Ajax 实现的。
我做搜索(发布)
这对我来说似乎在语义上不正确。搜索是一种不应修改服务器上任何状态的操作。因此,使用GET
似乎更合适。当您使用GET
时,您的好处是所有参数都已存在于查询字符串中,因此在连续的 POST 操作(例如在您的情况下修改帐户)时保留。因此,RefreshData
操作可以将AccountSearchViewModel
作为参数,模型绑定器将处理其余的工作。