2013-06-24 76 views
1

例如,我可以有像,將類的實例傳遞給另一個控制器中的操作?

public class HandleMessageController : Controller 
{ 
    public ActionResult ShowMessage(HandleMessage message) 
    { 
     return View(message); 
    } 
} 

和另一個控制器的另一個動作的動作,

RedirectToAction("ShowMessage", "HandleMessage", new HandleMessage(.....)); 

我測試了它和行動ShowMessage總是空message

型號HandleMessage

public class HandleMessage 
{ 

    public HandleMessage(string message, string controllerName, string actionName, bool isError) 
    { 
     ActionName = actionName; 
     ControllerName = controllerName; 
     Message = message; 
     IsError = isError; 
    } 
..... 

更新: RedirectToAction後的網址是

http://localhost:61666/HandleMessage/ShowMessage?ActionName=XXXX&ControllerName=XXXX&Message=The%20message&IsError=False 

回答

1

它應該工作,但不是你想使用的方式。您不能在重定向到動作或任何其他「鏈接生成」方法中傳遞HandleMessage實例。你必須爲它設置一個更正(使用正確的模式元素名稱 - 屬性映射)或創建一個鏈接,如?Message = error & IsError = True(就像POST請求中的wy一樣,但現在每個參數都應該位於查詢字符串中[如果將相關屬性重命名爲Action和Controller],則動作和控制器將來自路由)。

+0

我應該使用字符串連接來生成Url嗎?我以爲Asp.Net MVC會自動將實例轉換爲查詢字符串。我如何從路由中獲得動作和控制器?謝謝。 – ca9163d9

+0

嗯,它適用於你的對象實例我忘記了路由數據可以填充一個匿名對象,所以爲什麼不能使用具體類型?現在您必須提供一個無參數的構造函數,它現在應該可以工作。 –

1

看着你的問題,它看起來像你的模型/類沒有一個空的構造函數。

默認的.NET模型聯編程序需要一個默認構造函數來初始化該類,然後設置該類的公共屬性。

嘗試將此代碼添加到您的類:

public class HandleMessage 
{ 
    public HandleMessage() 
    { 
    } 
} 

此外,如果這仍然不起作用,你試圖做重定向方法是這樣的:

RedirectToAction("ShowMessage", "HandleMessage", new { message = new HandleMessage(.....) }); 

編輯:

仔細研究這一點,似乎對於更復雜的對象,路徑值不是存儲它的最佳方式。

我讀了this link,它表明這通常是通過使用TempData字典來處理的。將它存儲在這裏只會用於請求,但允許您移動這些複雜的對象。

最後,我能得到它的工作,而無需使用的TempData的,正好做你的,但是對傳入的動作我沒有指定爲的handleMessage的結合,但簽名:

public ActionResult ShowMessage(string Message, string ControllerName, string ActionName, bool IsError) 
{ 

} 
+0

剛剛添加了一個默認的空構造函數,它仍然不起作用。 – ca9163d9

+0

'new {message = new HandelMessage(...'會生成一個url ...'message = NameSpace.HandleMessage' – ca9163d9

+0

編輯如何? –

1

我不認爲你可以將類傳遞給重定向的動作。重定向是通過生成url來完成的,因此它不能包含類。

但是,這裏是解決方法。您可以使用TempData

TempData["some_unique_name"] = new HandleMessage(); 
RedirectToAction("ShowMessage", "HandleMessage"); 

而在重定向動作

HandleMessage message = (HandleMessage)TempData["some_unique_name"]; 
0

我覺得在動作變量名messageDefaultModelBinder操作搞亂。現在有兩個候選資產,名稱爲message,一個在動作方法參數中,另一個在HandleMessage類中。看起來DefaultModelBinder正在嘗試捕獲Message=The%20message值,並試圖將其設置爲HandleMessage實例。您可以重命名變量,而不是message,如msg左右,它應該可以工作。

P.S. HandleMessage類應該有一個參數更少的構造函數DefaultModelBinder來處理。

希望這有助於。

相關問題