2011-10-28 19 views
6

我知道一個視圖應該只顯示內容,除了顯示信息所需的內容外本身不執行任何邏輯。視圖應該如何「分離」?

什麼是最好的方式,在保持這一點,來處理這種簡單的情景:

  1. 用戶點擊刪除項目
  2. 如果該項目仍與其他系統有關,顯示「你可以不要刪除這個。「
  3. 否則,顯示一個確認形式的職位,以行動/刪除/編號

我可以在視圖中非常容易地做一些事情,如:

@if (Model.Children.Count > 0) 
{ 
    <p> 
    You can't delete this! 
    </p> 
} 
else 
{ 
    using (Html.BeginForm()) 
    { 
    <p> 
     Are you really sure you want to delete this? 
    </p> 
    <p> 
     <input type="submit" value="Confirm" /> | 
     @Html.ActionLink("Cancel", "Index") 
    </p> 
    } 
} 

是否有令人信服的理由提出兩點意見並根據有多少孩子,讓控制器返回適當的視圖?看起來像是簡單和關注點分離的折衷。

+0

我將使用兩個視圖,它總是更好地讓你的觀點儘可能簡單。 –

回答

4

這是一個非常簡單的例子,所以乍一看似乎無害的(如果它保持這樣它肯定是)。但是,請記住這些因素:

  • 如果它變得不僅僅是兒童?也許還有其他三種關係隨着時間的推移出現,現在你需要檢查你的觀點中的所有關係嗎?突然代碼味道更強。
  • 把這種類型的邏輯控制器可以讓其他的方法的問題更明顯或易後,例如,增加一個Ajax版本,可以讓你帶來的「你不能刪除這個」回饋用戶無需離開以前頁。
3

我會分離那些在2個不同的視圖,並具有控制器動作挑基於視圖模型值(Children.Count在這種情況下)正確的視圖。但這是說另一種方法也沒有錯。它適用於像這樣的簡單場景。

2

對於這種場景,通常你會有一個Model屬性,它實際上是你是否可以刪除它的標誌(這更符合ViewModel方法),以便視圖不是實際上是在做邏輯,控制器只是告訴視圖什麼動作可用。

@if(Model.CanDelete) { 
    using (Html.BeginForm()) 
    { 
     <p> 
     Are you really sure you want to delete this? 
     </p> 
     <p> 
      <input type="submit" value="Confirm" /> | 
      @Html.ActionLink("Cancel", "Index") 
     </p> 
    } 
} else { 
    <p>You can't delete this!</p> 
} 

CanDelete可以使用兒童數據狀態,角色成員資格,經營狀況等,但到視圖的組合控制器來填充所有這些東西不應該的問題

相關問題