2016-02-19 43 views
-1

我正在使用EditorTemplates對所有輸入字段進行樣式設置。像魅力一樣工作,但現在我需要EditorTemplates的兩個主題,一個用於正常形式,另一個用於我的嚮導形式。根據BeginForm覆蓋EditorTemplate

我已經使用重載的Html.BeginWizardForm()圍繞這些Html.EditorFor - 但我怎麼讓MVC邏輯在Html.BeginWizardForm()內部作出反應?

回答

0

Chris Pratt似乎沒有可能擁有多個EditorTemplates。

然而,我通過擴展MvcForm並創建了一個向ViewContext(在我的情況下爲「wizardContext」=> true)和向處理設置wizardContext => false添加值的WizardForm。

這讓我可以在EditorTemplates中添加一個檢查,看看我是否在wizardContext的內部或外部,這將通過嵌套的EditorFor傳播,並以這種方式允許我擁有不同的主題,而無需在EditorFor中特定。

0

EditorTemplates的設計有點全球化。但是,您可以重寫它們,就像其他任何視圖一樣,因爲它們只是視圖。例如,假設您有類似Views\Shared\EditorTemplates\String.cshtml的內容,則可以在Views\Foo\EditorTemplates\String.cshtml上創建另一個視圖,對於從FooController調用的任何操作,將使用後一個編輯器模板,而不是Shared中的那個。如果在特定控制器或區域上下文中使用嚮導窗體,則可能可以在您的方案中完成此項工作。

儘管如此,沒有辦法自動發生這種情況。不過,一些手動選項仍然存在。

  1. 可以裝飾嚮導的上下文中使用與UIHint屬性視圖模型的屬性。例如,假設上述相同的共享編輯模板,你可以這樣做:

    [UIHint("WizardString")] 
    public string Foo { get; set; } 
    

    這將導致它來尋找Views\Shared\EditorTemplates\WizardString.cshtml代替。

  2. 您可以通過在呼叫使用的編輯器模板EditorFor

    @Html.EditorFor(m => m.Foo, "WizardString") 
    

所有這一切說,這裏最大的問題是,你似乎是違反了很好的靚芯主網頁設計。 HTML是關於結構,而不是演示。 CSS用於演示。因此,如果您希望在某個上下文中看起來不同,正確的方法是應用不同的CSS。如果事情設計得很好,你的HTML應該不需要改變。

+0

我絕不會違反核心原則 - 在我的情況下,我使用基於表單類型的引導內聯和水平表單。這裏編輯器模板的主題完全符合html標記的變化。 –

+0

編輯器模板不應包含您的實際表單元素,並且您可以在其中應用「表單橫排」或「內聯」類。無論哪種情況,實際字段的所有標記都是相同的。所以,是的,如果你實際上將你的表單元素包含在編輯器模板中,那麼你做錯了。 –

+0

請explaing如何<形式類=「形內聯」>

和 <形式類=「形橫」>
是相同的標記? –