2009-09-23 86 views
1

看完這個video後,我想知道如果我使用我的控制器錯了。控制器究竟應該包含什麼?MVC如何保持模型瘦身

對於我的博客,我有一個post控制器,具有方法: 創建 顯示 列表 loadPost 像 厭惡

雖然我的崗位模型只有少數訪問規則,驗證規則和相關信息。網絡上有MVC應用程序的例子嗎?

+2

我的名字不是MVC。我建議你停止喂她。 ;-) – slashmais 2009-09-23 19:21:47

回答

8

我強烈建議你閱讀 http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/04/24/how-we-do-mvc.aspx

這裏是我的什麼控制器不應該做的不完全名單:

  • 綁定後的數據,查看模型 - 不,模型粘合劑應該這樣做
  • GET從倉庫實體 - 我說沒有,模型粘合劑或行動過濾器應
  • 計算的東西 - 不,視圖模型或實體應
  • 授權 - 也許,但它是更好的傳球屬性/過濾器
  • 驗證 - 只有當它從實體回來/域(即業務規則),視圖模型(演示文稿)驗證應該被自動處理(粘合劑等)

應該做的:

  • 獲取綁定,驗證視圖模型作爲輸入
  • 調用領域層,傳遞從視圖模型數據
  • 手柄域層錯誤
  • 路線取決於視圖模型適當的行動/視圖/域導致

壞:

public ActionResult PlaceOrder(Guid orderid) 
{ 
    if (HttpContext.Session["user"] == null) 
    return Redirect("Login"); 
    if (!ValidOrderId(orderid)) return Redirect(); 
    var order = cart.Get(orderid); 
    if (order == null) { ViewData["orderid"] = orderid; return View("Select"); } 
    order.Status = OrderStatus.Placed; 
    foreach (var item in order.Items) 
    item.Update(); 
    var cart = Cart.GetCurrent(); 
    cart.Save(order); 
    return Redirect("Show", "Orders", new { orderid = orderid }); 
} 

[Authorize] 
[ModelStateToTempData] 
// OrderViewModel.Id/OrderViewModel.Instance - validates id, 
// gets it from repository, set Instance or ModelState error 
public ActionResult PlaceOrder(OrderViewModel<Order> order) 
{ 
    if (!ModelState.IsValid) 
    return View("Select", order); 
    var order = order.InstanceFromDatabase; 
    _injectedCart.SetOrderPlaced(order); 
    return RedirectToAction<OrdersController>(c => c.Show(order)); 
} 

順便說一句,我很少看到好的MVC例子,包括的NerdDinner。它們都處理動作內部的業務邏輯,沒有視圖模型等等。這通常適用於他們所參​​與的 - MVC功能演示 - 但它不應被視爲優秀的設計示例。一個或多或少的好例子是CodeCampServer,以及ASP.NET MVC In Action中的伴奏書。但並非沒有缺點(例如貧血域模型)。

但是,如果不嘗試遵循域驅動設計,而是有一個簡單的數據驅動的需求,事情可能會更容易。

+0

非常好的帖子。 – Marco 2013-04-12 13:38:11

1

我嘗試使用胖視圖模型和瘦控制器,控制器將工作交給我的業務對象。

NerdDinner是一個很好的示例應用程序,但StackOverflow是我最喜歡的MVC站點的示例。

善,

1

控制器應包含足夠的邏輯以解釋什麼用戶已通過所述處理開了一個服務層之前要做。 因此,如果用戶說「馬克這篇文章是一個我喜歡」,點擊喜歡按鈕,該控制器可確保用戶被授權,然後讓我們的服務層手柄實際上做標記後等 如果工作用戶說「創建一個新的博客條目」,那麼控制器將收集帖子,標籤,時間戳和其他相關信息,並對數據進行最小限度的驗證。然後它將處理切換到服務層。如果服務層發現問題,那麼它應該拋出一個異常,然後您可以在控制器中處理該異常。

相關問題