2012-02-06 53 views
0

我對如何實現EditorForModel有點困惑。我得到了在Views \ Shared \ EditorTemplates中設置模板的想法,但我認爲我已經過度研究(如果可能的話),這導致了我的困惑。使用多種類型的模型並創建不同的EditorForModel模板

基本上,我試圖儘量減少代碼複製。我爲客戶提供了5項服務,每項服務都有4至6種不同的解決方案。使事情變得更加複雜,在某種程度上可以在許多解決方案中共享某些類型。

爲了使這個簡單,採取類型:

public string FirstName { get; set; } 

我會在每個解決方案使用這個(和上升中的每一個服務的「樹」)。但很明顯,我有許多其他類型的解決方案,或者在幾個解決方案之間共享,或者根本沒有。

比方說,我有100種類型的每個服務。我可以將它們分開爲不同的查看模型,但是我必須將這5個服務分解。我寧願將它們全部保存在一個View Model,每個服務中。

我嘗試創建模板時遇到了麻煩。我想使用模板,因爲我使用的是嚮導,我不想在特定的解決方案中爲嚮導的每個部分重新創建視圖,特別是如果它是相同的「數據」(並且再次考慮因素我擁有的解決方案數量)。

因此,我創建了一個BasicDetails.cshtml視圖(帶有名字,姓氏和電子郵件等類型),它可以在所有解決方案中實際使用。一個編輯器模板在這裏看起來很理想,但是我的困惑產生了,因爲如果我使用ServiceViewModelOne.cs並執行@ Html.EditorForModel(),我要麼吐出所有100種類型,要麼使用模板只吐出我想要的內容BasicDetails.cshtml,在\ Views \ Shared \ EditorTemplates \ ServiceViewModelOne.cshtml中創建一個模板。

現在,我將能夠,例如,請執行下列操作:

@Html.EditorForModel("BasicDetails") 
@Html.EditorForModel("WizardStep2") 
@Html.EditorForModel("WizardStep3") 

因爲我想讓(和但更多的我想作)每個自定義模板,使用相同的ServiceViewModelOne的.cs?如果我是正確的,我會再有以下文件夾結構:

  • \查看\共享\ EditorTemplates \ BasicDetails.cshtml
  • \查看\共享\ EditorTemplates \ WizardStep2.cshtml
  • \查看\共享\ EditorTemplates \ WizardStep3.cshtml
  • ...

顯然,每個模板中我會有相應的

<div class="editor-label"> 
    @Html.LabelFor(m => m.FirstName) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(m => m.FirstName) 
    @Html.ValidationMessageFor(m => m.FirstName) 
</div> 
... 

所有的HTML輸入特定向導中的步驟(包括整個HTML佈局)

這會是一種適當的方式做我想做的,還是我找錯了樹?

更新: 我想過使用UIHint,但我不確定它是否會完全工作。

我可以在模型層使用UIHint:

[UIHint("BasicDetails")] 
public class MyModel {} 

或在類型級別

public class MyModel 
    { 
     [UIHint("FirstName")] 
     public string FirstName { get; set; } 
    } 

而且我可以在那裏創建一個MyModel.cs,然後自動映射的一些類型到MyViewModelOne.cs,MyViewModelTwo.cs等。

不過,我想我會結束自己的拳擊,可以這麼說。

比方說,我有Type1,Type2,Type3,Type4。 Type1可以用於每個解決方案(保持簡單,可以說有4個解決方案)。 Type2和Type3可以用於一種解決方案,但不能用於其他解決方案。並且可以說在另一個解決方案中,我可以使用Type2和Type4。

使用UIHint或automapping意味着我將不得不創建3個不同的東西來解決上述問題,以及如果我需要在另一個解決方案中使用Type3和Type4會怎樣。

我可能脫離基地,但它似乎限制迫使我創造多個排列,這正是我希望避免的。

我會承認沒有使用過AutoMapper,並且正在研究是否有幫助。

回答

0

UPDATE(ANSWER) 我想出瞭如何處理這個問題,以防萬一這對其他人發佈答案有幫助。 出於我的目的,這有助於大幅度提高,並在堅持DRY(有點)的情況下開闢了許多可能性,因爲擁有一個模板比擁有相同字段的6個文件更好。

我發佈了這個問題,因爲我試着在\ Views \ Shared \ EditorTemplates \ BasicDetails.cshtml中放置一個模板,並剛剛得到我返回的所有屬性(如FirstName等字段),而不是我想要的(FirstName ,姓氏,電子郵件)。如果我有模型BasicDetails.cs(例如),通常將模板放在\ Shared \文件夾中是正確的。

讀埋在Brad Wilson's Post的評論,我意識到,我應該改爲嘗試把模板

\ {意見} CurrentController \ EditorTemplates \ BasicDetails.cshtml。

工作顯示視圖和驗證錯誤彈出「所需」字段和嚮導,單擊任一「下一步」或之後完成其自身的措施「提交」

要重申,我用

@Html.EditorForModel("BasicDetails") 

其中「BasicDetails」是電流控制器裏面的模板的名稱。

1

由於問題的複雜性,它有點令人困惑,但我會採取一個刺。

編輯模板以兩種方式處理約定 - 文件的名稱需要與模型的名稱匹配,並且模板的類型需要與模型的類型相匹配。

所以,如果你有多個不同名稱的類,但你想使用一個模板,它不會工作。

我可以看到幾個選項。

  1. 在模型上使用[UIHint]來指定模板的名稱。
  2. 在您的服務和演示文稿之間創建另一個層,將模型映射到視圖模型中,這樣View不需要關心渲染100多個不同的類。你可以使用像AutoMapper這樣的東西來輕鬆完成這個任務。

我強烈建議使用選項2(如果可能)。再次,不知道我是否理解你的問題。

+0

你絕對明白我的困境。我已更新我的問題,以考慮您的迴應。 – REMESQ 2012-02-06 20:47:27

+1

@REMESQ - 聽起來像你已經按照你的編輯外觀排序了。我很高興,因爲它變得更加混亂。 :) – RPM1984 2012-02-07 02:20:36