2014-11-04 51 views
0

我需要根據我保存的用戶類型顯示不同的表單域。ASP.Net MVC:如何重新使用不同模型的視圖和部分?

我有一些用戶類型和一些用戶類型具有相同的數據,所以你可以想象以下(與很多更多類型的潛力):

  1. 類型A:產品名稱,密碼等,LinkedToLegacySystemA,LegacySystemAUserId
  2. 的TypeB:名稱,密碼等,LinkedToLegacySystemB,LegacySystemBUserId
  3. TypeC:名稱,密碼等,LinkedToLegacySystemC,LegacySystemCUserId,LegacySystemCAdminLevel

當我創建一個新用戶時,我可能在任何這些系統的上下文中,但我確切知道我連接的是哪個系統(每種類型的用戶都有一個特定的CRUD控制器),但我想共享視圖(如果可能的話)。所以我有這樣的:TypeAUserController,TypeBUserController,TypeCUserController,每個都有自己的創建,檢索,更新和刪除獲取/發佈操作。

所以最基本的問題是「如何重新使用視圖來顯示每個用戶的創建?」

編輯: 爲了進一步說明,每個用戶都有共享信息,這是我想共享的視圖。我迄今爲止提出的想法假定模型之間的差異將被局部地包含,並且每個潛在模型都有自己的觀點。因此,我們針對用戶上的每個CRUD操作查看單個頁面級模型,然後針對每個封裝差異的子模型查看單個子模型。 由於下面列出的原因,這不是一個好方法。

+1

很難說你的模糊程度如何。視圖應該強制輸入到你的模型中。如果你有不同的型號,你應該有不同的看法。但是,您始終可以擁有包含所有這些視圖的視圖模型。你可以擁有一個所有視圖模型繼承的基類,然後使用EditorTemplates來渲染特定的類型。但是,所有這些都有你需要處理的各種問題。 – 2014-11-04 20:09:57

+0

是的,我爲自己的頭腦風暴添加了自己的答案。他們符合你的建議,你是對的,他們每個人都有自己的問題:( – 2014-11-04 20:26:58

回答

0

確定真正的類型,這裏是如何實際上得到實現......

3頁級「顯示器」的型號爲GET上每個CRUD,其每一個

  • CreateLegacyUserAModel
    • SharedUserModel模型(這其中有在其上進行驗證數據的註釋)
    • LegacyUserAModel(這其中有於它的驗證數據的註釋)
  • ...
  • CreateLegacyUserCModel
    • ...

然後訪問量:

  • CreateLegacyView(使用CreateLegacyUserAModel,處理創建窗體)
    • SharedUserFieldsView(使用SharedUserModel)
    • LegacyUserFieldsView(使用LegacyUserAModel)

我們幾乎翻轉查看/模型。

缺點

  • 需要爲每個CRUD操作每個CRUD操作的查看和具體型號(4 * N DisplayModels)
  • 一個職位(不是一個真正的騙子,說實話,這對我來說很有意義)

優點

  • 無需任何地方施放任何型號,沒有CA sts in the views and no casts in the POST actions
0

潛在的解決方案1: 通過這個模型,視圖

  • CreateUserPageModel
    • BoringModelWithSharedStuff
    • LegacySystemAModel
    • LegacySystemBModel
    • LegacySystemCModel
    • PartialName

然後在視圖中使用部分名稱來決定要顯示哪個部分並選擇要傳遞給它的非空模型。

當提交表單時,它會提交到一個頁面,其中包含一個自定義模型聯編程序,它將選擇正確的模型。

優點:

  • 允許父視圖被重用在型號
  • 差異被放置在不同的諧音

缺點:

  • 查看已找到填充兒童模型傳遞給部分
  • 部分名稱必須通過,因此必須在控制器中選擇路徑
+0

有一個共享模型,需要爲每個新的遺留系統編輯看起來像一個壞模式。必須有一種方式離開模型對於遺留系統a到c在添加遺留系統時未觸及d – 2014-11-04 20:25:15

0

潛在解決方案2:使用視圖包。

該模型將是超級簡單:

  • CreateUserPageModel
    • SharedDataModel

的視圖會然後檢查Viewbag如它會加載的部分信息,無論是通過指定部分名稱或爲視圖提供枚舉來打開。 該部分會將viewbag中的物品投射到特定類型。

優點:

  • 允許父視圖被重用在型號
  • 差異被放置在不同的partials

缺點:

  • 查看具有挑正確的部分加載
  • Partia升具有投射到其已知類型
+0

另外,當提交表單時,這需要一個定製的模型聯編程序,它可以選擇正確的模型,從而有效地確定要再次投入什麼 – 2014-11-04 20:33:41

0

潛在的解決方案3:使用一個標記接口

  • CreateUserPageModel
    • SharedDataModel
    • ILegacyUserDataModel
    • PartialName

視圖根據傳遞的模型加載部分,然後將ILegacyUserDataModel傳遞給部分。然後該部分將投射到它設計的任何模型上。

優點:

  • 允許父視圖被重用在型號
  • 差異被放置在不同的partials

缺點:

  • PartialName必須被傳遞所以必須在控制器中選擇路徑
  • 部分必須從接口轉換爲用於其設計
+0

我真的不喜歡這個想法使用標記界面時,感覺髒 – 2014-11-04 20:24:08

+0

另外,提交表單時,這需要一個自定義模型聯編程序,它可以選擇正確的模型,從而有效地找出要再次投入的內容。 – 2014-11-04 20:32:14