如何在控制器上访问 ViewModel

How to access ViewModel on the controller

我正在学习 MVC,我正在尝试了解如何在控制器级别访问 ViewModel。

我的问题是如何在 MethodTwo 中访问 ViewModel?

例如:

视图模型

public class MyViewModel
{
    public int MyID { get; set; }
    public string MyString { get; set; }
    public bool MyBool { get; set; }
}

在控制器中我有这个:

public ActionResult MethodOne(int myId, string myString, bool myBool)
{
    MyViewModel mvm = new MyViewModel { MyID = myId, MyString = myString,yBool = myBool };
    return View("MyPrint", mvm);
}

在我的 MyPrint 页面上,我正在执行 Ajax GET(到同一个控制器)并且我想访问同一个 ViewModel。

public string MethodTwo()
{
    // How can I access the ViewModel here???
    //var myString = DoStuff(MyViewModel);
    return myString;
}

不清楚你想要达到什么目的,但一般来说,如果你想访问方法中的某些东西,你必须将它作为参数传入:

public string MethodTwo(MyViewModel model)

这样您就可以从另一个操作中调用它,例如:

public ActionResult MethodOne(int myId, string myString, bool myBool)
{
    MyViewModel mvm = new MyViewModel { MyID = myId, MyString = myString,yBool = myBool };

    var result = MethodTwo(mvm);

    return View("MyPrint", mvm);
}

但是,如果您谈论的是实际调用另一个操作方法,那就有点不同了。如果您需要加载另一个操作,则需要将用户重定向到该新操作。这也意味着您必须将所需的任何数据与重定向一起传递,并且由于重定向将导致发出 GET 请求,因此您所要做的就是重定向到 URL 的查询字符串。尝试在查询字符串中传递整个 class 实例是不可取的。您要么必须将其展平为键值对,要么必须 JSON 将其编码为可以传递的字符串,这意味着您必须 JSON 在另一个中对其进行解码。

由于您实际上是在第一个操作中基于简单类型参数构建视图模型 instacne,我建议您将这些相同的类型参数传递给第二个操作并在那里重建它。