基于 BeginForm 覆盖 EditorTemplate
Override EditorTemplate based on BeginForm
我正在使用 EditorTemplates 来设置我所有输入字段的样式。很有魅力,但是现在我想要两个 EditorTemplates 主题,一个用于普通表单,一个用于我的向导表单。
我已经在那些 Html.EditorFor 周围使用重载的 Html.BeginWizardForm() - 但是我如何让 MVC 逻辑对 Html.BeginWizardForm() 内部做出反应?
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 真的不需要改变。
Chris Pratt 所说的,似乎不可能有多个 EditorTemplates。
然而,我通过扩展 MvcForm 找到了一个解决方法,并创建了一个 WizardForm,它向 ViewContext 添加了一个值(在我的例子中 "wizardContext" => true)并在处理设置 wizardContext => false 时。
这允许我在 EditorTemplates 中添加检查我是在 wizardContext 内部还是外部,这将通过嵌套的 EditorFor 传播,这样我就可以拥有不同的主题,而不必在EditorFor.
我正在使用 EditorTemplates 来设置我所有输入字段的样式。很有魅力,但是现在我想要两个 EditorTemplates 主题,一个用于普通表单,一个用于我的向导表单。
我已经在那些 Html.EditorFor 周围使用重载的 Html.BeginWizardForm() - 但是我如何让 MVC 逻辑对 Html.BeginWizardForm() 内部做出反应?
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 真的不需要改变。
Chris Pratt 所说的,似乎不可能有多个 EditorTemplates。
然而,我通过扩展 MvcForm 找到了一个解决方法,并创建了一个 WizardForm,它向 ViewContext 添加了一个值(在我的例子中 "wizardContext" => true)并在处理设置 wizardContext => false 时。
这允许我在 EditorTemplates 中添加检查我是在 wizardContext 内部还是外部,这将通过嵌套的 EditorFor 传播,这样我就可以拥有不同的主题,而不必在EditorFor.