2012-09-05 62 views
1

我仍然在學習繞過MVC編程的方法,並且有一個問題需要我爲我澄清一件事,即關於我的控制器中的Get和POST ActionResult函數。 I'll給你三種可能的情形(實際上是三個問題):在控制器中創建函數的MVC最佳實踐

我的第一個場景:

public ActionResult Derp() 
{ 
    Derpina derpina = new Derpina(); //Should I need to pass this to View? 
    return View(derpina); 
} 

[HttpPost] 
public ActionResult Derp() 
{ 
    Derpina derpina = new Derpina(); 
    UpdateModel(derpina); 
    //doStuff and save to DB 
    return RedirectToAction("Index"); 
} 

我的第二個場景:

public ActionResult Derp() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult Derp() 
{ 
    Derpina derpina = new Derpina(); //Is this the cleanest way? 
    UpdateModel(derpina); 
    //doStuff and save to DB 
    return RedirectToAction("Index"); 
} 

我的第三個場景:

public ActionResult Derp() 
{ 
    Derpina derpina = new Derpina(); 
    return View(derpina); 
} 

[HttpPost] 
public ActionResult Derp(Derpina derpina) 
{ 
    UpdateModel(derpina); //Should I need to do that at all? 
    //doStuff and save to DB 
    return RedirectToAction("Index"); 
} 

我傾向於第二種情況,因爲我不需要創建新實體並將其傳遞給View。我想that's爲什麼I'm問你們,曾有人告訴我,有沒有「愚蠢的問題」,所以我希望你能容忍我:)

  1. 我是否需要通過新創建的Derpina到查看
  2. 第二種情況不是「最佳實踐」嗎?
  3. 在第三種情況下,如果我將Derpina作爲參數傳遞到HttpPost函數中,MVC框架是否已經更新模型?

英語不是我的母語,所以我希望這些問題有任何意義。無論如何,提前感謝您的幫助,您可以給我澄清。

EDITED

後一個答案,我收到我要添加第四場景:

public ActionResult CreateDerp() 
{ 
    return View(); 
} 

[HttpPost] 
public ActionResult CreateDerp(Derpina derpina) 
{ 
    UpdateModel(derpina); 
    //doStuff and save to DB 
    return RedirectToAction("Index"); 
} 

請問這是正確的做法,我的意思是,如果沒有必要I'm發送模式GET函數中的視圖?例如,如果我使用上面的代碼建議的Create函數。

回答

3

第一個問題 - >如果您的視圖必須顯示數據庫中的數據,則需要將模型發送到視圖,以便它可以在頁面上顯示所需的數據。

第二個問題 - >在發佈時,如果不需要將您的模型作爲post方法中的參數,那麼總是可以推薦的,這就是模型聯編程序的整個目的,您如何更新數據庫中的數據應該是在我的意見中,這是最簡潔的方式。

第三個問題 - > mvc框架確實創建了一個包含視圖中數據的新模型(如果用戶輸入了任何內容),但並不意味着它會自動更新對象或應用數據庫中的更改,你必須明確地做到這一點,你需要的方式。

我希望我至少有一點幫助。

+0

你好@Freeman,謝謝你的回答。我編輯了我的問題,並想問你是否認爲如果我使用Create()函數,這將是正確的方法? – gardarvalur

1

問題1:如果您正在初始化某些值(例如在構造函數中),則只需將新實例傳遞給視圖。

問題2:如果您創建Derpina的新實例,則不會獲取用戶輸入的值。您需要像在場景3中那樣將Derpina的實例傳入Derp方法中。

問題3:您不需要調用UpdateModel(),但應檢查模型狀態(ModelState.IsValid),然後執行業務邏輯並將模型保存到數據庫中。

+0

謝謝@ user1649856的輸入。問題2的答案就是現場。我想知道是否應該在HttpPost函數內創建實例,並將其作爲參數傳遞。你清除了我再次感謝你:) – gardarvalur