我正在使用EditorTemplates来设置所有输入字段的样式。像魅力一样工作,但现在我想要两个EditorTemplates主题,一个用于普通表单,然后一个用于我的向导表单。
我已经在那些Html.EditorFor周围使用了重载的Html.BeginWizardForm()但是如何让MVC逻辑在Html.BeginWizardForm()中做出反应?
答案 0 :(得分:0)
EditorTemplates旨在具有一定的全球性。但是,您可以像任何其他视图一样覆盖它们,因为它们只是视图。例如,假设您有类似Views\Shared\EditorTemplates\String.cshtml
的内容,则可以在Views\Foo\EditorTemplates\String.cshtml
创建另一个视图,对于从FooController
调用的任何操作,将使用后一个编辑器模板而不是一个来自Shared
。如果在特定控制器或区域上下文中使用向导表单,则可以在场景中使其工作。
您可以使用UIHint
属性修饰向导上下文中使用的视图模型的属性。例如,假设上面使用相同的共享编辑器模板,您可以执行以下操作:
[UIHint("WizardString")]
public string Foo { get; set; }
这会导致它寻找Views\Shared\EditorTemplates\WizardString.cshtml
。
您可以传递编辑器模板,以便在调用EditorFor
:
@Html.EditorFor(m => m.Foo, "WizardString")
所有这一切,这里最大的问题是你似乎违反了良好的网页设计的核心原则。 HTML是关于结构,而不是表示。 CSS用于演示。因此,如果您希望在特定上下文中看起来有所不同,那么正确的方法是应用不同的CSS。如果设计得好,那么你的HTML不应该真的改变。
答案 1 :(得分:0)
似乎正如Chris Pratt所述,不可能有多个EditorTemplates。
然而,我找到了一个解决方法,扩展了MvcForm,并创建了一个WizardForm,它为ViewContext添加了一个值(在我的情况下" wizardContext" => true)和处理设置wizardContext =>假的。这允许我在EditorTemplates中添加一个检查,如果我在wizardContext内部或外部,它将通过嵌套的EditorFor传播,并以这种方式允许我有不同的主题,而不必在EditorFor中具体。