Asp.net mvc 3 基于BegInfo重写EditorTemplate

Asp.net mvc 3 基于BegInfo重写EditorTemplate,asp.net-mvc-3,mvc-editor-templates,Asp.net Mvc 3,Mvc Editor Templates,我正在使用EditorTemplates设置所有输入字段的样式。工作起来很有魅力,但是现在我想要两个EditorTemplates主题,一个用于普通表单,另一个用于我的向导表单 我已经在那些Html.EditorFor周围使用了重载的Html.BeginWizardForm(),但是如何让MVC逻辑在Html.BeginWizardForm()内部做出反应呢?EditorTemplates被设计成具有某种全局性。但是,您可以像其他视图一样覆盖它们,因为它们只是视图。例如,假设您有类似于Views

我正在使用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中具体说明。

    我决不会违反核心原则——在我的例子中,我使用的是基于表单类型的引导内联表单和水平表单。在这里,编辑器模板的主题将随着html标记的更改而完美匹配。编辑器模板不应包含实际的表单元素,这就是您可以应用
    表单水平
    表单内联
    类的地方。在这两种情况下,实际字段的所有标记都是相同的。所以,是的,如果你真的在编辑器模板中包含表单元素,那你就错了。请解释一下名称和电子邮件是如何相同的标记的?