如何在控制器上访问ViewModel

时间:2015-11-02 14:06:21

标签: asp.net-mvc asp.net-mvc-3 viewmodel

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

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

  • 我是否需要在AJAX调用中重新发送ViewModel?
  • 是否有一种简单的方法可以在该方法中访问View Model?

例如:

视图模型

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;
}

1 个答案:

答案 0 :(得分:2)

目前尚不清楚您要实现的目标,但通常情况下,如果您想要访问方法中的某些内容,则必须将其作为参数传递:

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的查询字符串。尝试在查询字符串中传递整个类实例是不可取的。您必须将其展平为键值对,或者您必须将JSON编码为可以传递的字符串,这意味着您必须将JSON解码为另一个。

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