2011-02-09 128 views
7

我一直在研究這個MVC 3 Razor應用程序,並且通常利用視圖模型來實現我的視圖。MVC控制器操作 - 處理POST和GET無重複代碼

我的視圖模型的相當數量包含更多的信息,而不僅僅是我在表單中與我交互的特定實體。因此,我的GET操作處理程序將初始化視圖模型併爲每個屬性提供預期值等。

在我的POST動作處理程序中,檢查模型狀態是否有效,如果沒有,我重新顯示窗體/視圖錯誤。

在我的POST動作處理程序中,我發現自己必須從我的GET動作處理程序複製代碼才能重新呈現視圖。我如何實現我的控制器操作,以便我不必複製負責收集視圖模型數據的代碼?

我已經嘗試允許我的動作處理程序來處理POST和GET,但後來我有輸入參數來處理。我的POST動作處理程序將視圖模型作爲輸入參數,但GET動作處理程序不會。

+1

您能否提供一些您正在編寫的代碼示例? – marcind 2011-02-09 01:42:35

+1

您是否嘗試過重定向後操作以獲取操作? – frennky 2011-02-09 06:51:59

回答

4

在這樣的情況下,我們爲視圖模型創建了構建器。

看看this post下的選項3。

-1

您的POST操作方法應該能夠將viewmodel類型作爲參數,而不是所有單獨的數據片段。如果視圖模型的構建更加複雜,則可能需要爲視圖模型編寫一個模型綁定器,該模型綁定器可以完成更復雜的工作(您的操作方法仍將VM類型作爲參數)。

[HttpPost] 
public ViewResult MyAction(MyViewModel model) { 
    // model should now be fully populated; check ModelState.IsValid though in case there are errors (such as the user entering "abc" for an int property) 
} 
7

你的POST處理程序可以從GET處理程序返回的ActionResult,如下所示:

public ActionResult SomePageGet() { 
    var model = new SomePageViewModel(); 

    // Populate ViewModel: 
    ... 

    return View("SomePageGet", model); 
} 

[HttpPost] 
public ActionResult SomePagePost(SomePageViewModel input) { 

    // Validate the model: 
    ... 

    if (!ModelState.IsValid) { 
     // Return the GET page, with error messages: 
     return SomePageGet(); 
    } 

    return View("Success"); 
} 

由於ModelState中包含所有錯誤消息(和無效的輸入),該GET頁面將顯示他們正常。

0

您可以簡單地將通用代碼重構爲您正在處理的主實體的擴展方法。

然後根據需要多次呼叫,同時入住DRY

我不完全知道這個通用代碼的功能是什麼,但大多數情況下它將是相關的數據,用於豐富的表示。 在這種情況下,我更喜歡的解決方案是讓視圖使用RenderAction從另一個動作中加載額外的數據,這些數據可以在以後重構爲AJAX頁面更新並保留DRY並分離動作的關注點。

0

「......我發現自己不得不復制代碼...」

我不明白爲什麼;爲什麼你不能簡單地在你的控制器中創建一個成員並調用它?並非您的控制器中的所有內容都必須是Action。但你可能想看看建設者,而不是@ataddeini建議。

相關問題