我在页面上有3个视图模型的3个视图模型:
我想在2上执行POST后刷新1.这很简单,但如果我想保留使用搜索面板后获得的结果怎么办?
我可以用两种方式做到这一点,但两者看起来都很糟糕(如果我错了,请纠正我。)
首先(我选择并使用的那个)是在TempData中存储3.中使用的viewmodel。我执行搜索(POST)并在TempData中保存传递的viewmodel。然后每当我在不同的部分视图上进行POST时,我都可以使用TempData中的数据(搜索参数)来刷新1.
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个视图模型POST“大”视图模型。这样我将获得来自Search的viewmodel的数据,但我会发送许多不需要的信息,而不仅仅是我需要调用过程的Modal Popup的viewmodel。
我问过几个MVC人员有更好的经验,他们说他们从来不必将视图模型存储在TempData中,但它似乎比拥有1个Big表单并在每个POST中传递所有内容更合理。
你知道有什么更好的办法来解决这个问题吗?或者哪一个是正确的?
PS。主题有“最佳实践”但被删除的警告信息。我希望在SO上仍然允许提出意见。
PS2。我的大多数POST和&初始加载后的GET是通过Ajax。
答案 0 :(得分:0)
我做搜索(POST)
这对我来说在语义上似乎不正确。 搜索是一项不应修改服务器上任何状态的操作。所以使用#include <iostream>
#include <type_traits>
template <typename S, typename T>
class Abstract {
public:
Abstract() { std::cout << "Abstract: ctor called." << std::endl; }
virtual void operator()(void) {
std::cout << "Abstract::operator() called." << std::endl;
}
};
template <typename S, typename T>
class Concrete : public Abstract <S, T> {
public:
Concrete() { std::cout << "Concrete: ctor called." << std::endl; }
void operator()(void) override {
std::cout << "Concrete::operator() called." << std::endl;
}
};
template <typename S, typename T>
class A {
public:
A() { std::cout << "A: ctor called." << std::endl; }
};
template < typename S, typename T, typename U >
class B {
// hopefully a catch-all static_assert to warn the user about the template
// specialization.
};
template < typename S, typename T, typename U, typename V >
class B < S, T, Abstract<U, V> > {
public:
B() { std::cout << "B: ctor called." << std::endl; }
virtual void operator()(S s, T t, Abstract<U,V>& y) {
std::cout << "B::operator(S, T, U&) called." << std::endl;
y();
};
};
template < typename S, typename T, typename U >
class C : public B < S, T, U > {
public:
C() { std::cout << "C: ctor called." << std::endl; }
void operator()(S s, T t, U& y) override {
std::cout << "C::operator(S, T, U&) called." << std::endl;
y();
};
};
int main (int argc, char* argv[]) {
// B <int, int, A<double, double>> b1 { };
B <int, int, Abstract<double, double>> b2 { };
// B <int, int, Concrete<double, double>> b3 { };
C <int, int, Abstract<double, double>> c1 { };
// A <double, double> obj1 { };
Concrete <double, double> obj2 { };
// b1 ( 5, 6, obj1 );
b2 ( 5, 6, obj2 );
// b3 ( 5, 6, obj2 );
c1 ( 5, 6, obj2 );
return 0;
}
似乎更合适。当您使用GET
时,您可以获得所有参数已经存在于查询字符串中并因此在连续的POST操作(例如在您的情况下修改帐户)时保留的优点。因此,您的GET
操作可以将RefreshData
作为参数,模型活页夹将负责其余操作。