2011-07-04 74 views
0

我在我的HomeController的動作(保持簡單):ASP.NET MVC3發帖的形式返回到相同的動作

[HttpGet] 
[HttpPost] 
public ActionResult MyAction(MyOwnViewModel viewModel) 
{ 
    // do some stuff with the viewmodel and return it to the view. 
    // Selected values should be preserved inside the viewModel 

    return View(viewModel); 
} 

而且我想,每當我去的網址/主頁被稱爲這個動作/ MyAction。它抱怨說,它無法在HomeController上找到MyAction方法,我懷疑這是因爲viewModel參數。

有什麼辦法可以解決這個問題嗎?我期望viewModel參數只是null。

+0

不確定方法上的HttpGet和HttpPost過濾器的值。當他們被刪除時會發生什麼?你的MyOwnViewModel有一個默認的構造函數嗎?如果您不使用參數定義該操作,該操作是否會被調用? –

+0

另外,您是否使用剃刀並使用@model聲明指定您的viewmodel? –

+0

@ Zootius,默認的構造函數顯然無所謂。然而,正如你所提到的,移除[HttpGet]和[HttpPost]至關重要。感謝您的輸入! – Peter

回答

1

答案在這種情況下刪除一個或兩個[HTTPGET][HttpPost]行動過濾器。

對於其他人的薰染,只要模型類具有公共的默認構造函數,就可以有一個接受模型參數的操作方法,沒有方法的其他無參數版本。

在這種情況下,MVC ModelBinder會爲您生成模型類的空實例。

查看IModelBinder接口瞭解更多關於自定義模型綁定的信息。

+0

謝謝,這解決了我的問題:-) – Peter

0

你需要一個行動沒有參數的URL

public ActionResult MyAction() 
{ 

    return View(); 
} 

啓動它,並使用你已經有了處理提交的動作(這是應用HttpGetHttpPost屬性爲)從該視圖,這樣一那麼到那時你將有viewModel

+1

這是不正確的。您不需要*無參數操作方法。只要你傳遞的類有一個默認的構造函數,並且是在你的View中指定的類型,那麼MVC將爲你創建一個實例。 –

+0

@ Zootius,我只是說,OP應該是傳遞參數還是使用none參數方法開始。或者你在說別的嗎? – Bolu

+0

@ Zootius是對的,你不需要無參數的操作方法。您只能指定多個HttpVerb屬性。 – Peter

0

據我所知,我不知道如何將您自己的視圖模型通過訪問URL傳遞給您的動作,但是重新提到您提到的場景,我會盡力幫助您解決缺失的動作行爲以及通過ASP.NET MVC發現它的方式。

你是對的,因爲你的viewModel參數,MVC3的默認路由不會找到這個動作,所以你必須定義一個新的路由來匹配你的控制器動作。

考慮下面的代碼:

routes.MapRoute(
      "SearchRoute1",            // Route name 
      "MyAction/{viewModel}",        // URL with parameters 
      new { controller = "Home", action = "MyAction", viewModel = "" } // Parameter defaults 

     ); 

將定義這樣的事情你Global.ASAX文件中,特別是裏面RegisterRoutes(RouteCollection routes)方法, 使您的應用程序的路由表,瞭解你的操作方法,那麼你就可以正常處理請求。

讓我知道這是否幫助你,謝謝。

+1

這是不正確的。您不需要*無參數操作方法。只要你傳遞的類有一個默認的構造函數,並且是在你的View中指定的類型,那麼MVC將爲你創建一個實例。 –

+0

他試圖調用的是帶有參數的動作,而他實際調用的是MVC3將爲您的此調用生成的默認動作,但不是無參數的動作,並且我的答案不包含任何代碼用於無參數操作。如果我錯了,請和我糾正。 –

+1

問題是我們還不知道OP的上下文。我假設沒有任何參數的MyAction的定義,在這種情況下,即使沒有模型被傳遞給它,MyAction(MyOwnViewModel viewModel)**方法*也應該被調用。 。 –

0

用兩種不同的HTTP方法不能有一個ActionResult。您需要使用重載...

public ActionResult MyAction() 
{ 
    return View(new MyViewModel()); 
} 

而且

[HttpPost] 
public ActionResult MyAction(MyViewModel model) 
{ 
    // Do your stuff... 
    return View(model); 
} 
+0

你說得對,我只是覺得你的措辭是關閉的。您可以同時執行POST和GET操作。但是你不能使用屬性來指定它。它只適用於刪除GET和POST屬性。 – Peter

+0

你知道,我不知道該怎麼說!我更喜歡這種方式,因爲對我來說,它更易於閱讀。 – simonlchilds

相關問題