POST后如何从不同的局部视图访问数据

时间:2016-03-22 16:41:12

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

我在页面上有3个视图模型的3个视图模型:

  1. 帐户清单
  2. 模态弹出窗口(您可以在此修改多个帐户)
  3. 搜索面板
  4. 我想在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。

1 个答案:

答案 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作为参数,模型活页夹将负责其余操作。