2015-11-02 72 views
0

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

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

  • 我是否需要将ViewModel发送回AJAX调用?
  • 是否有一种简单的方法能够访问该方法中的视图模型?

例如:

视图模型

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

为了在'MethodTwo'中访问模型的值,您需要将它传递给'MethodTwo'。如果你正在做一个GET请求,这将是查询字符串中的值。 ajax请求是什么样的? – markpsmith

+0

$阿贾克斯({ 类型: 'GET', 网址: '/主/ MediaReach/GetPrintData', 的contentType: 'text/html的', 数据:{ MRPM:@Model } })。DONE (function(result){(“#abc”)。append(result); print(); })。 – PrivateJoker

+1

@JDS使用ModelBinding技术来获取Model内的控制器数据。 [好](http://odetocode.com/blogs/scott/archive/2009/04/27/6-tips-for-asp-net-mvc-model-binding.aspx)教程在这里。 –

回答

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,我建议只是将这些相同的类型参数传递给第二个动作并在那里重构它。