2015-11-02 69 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,我建議只是將這些相同的類型參數傳遞給第二個動作並在那裏重構它。