基于BeginForm覆盖EditorTemplate

时间:2016-02-19 12:54:41

标签: asp.net-mvc-3 mvc-editor-templates

我正在使用EditorTemplates来设置所有输入字段的样式。像魅力一样工作,但现在我想要两个EditorTemplates主题,一个用于普通表单,然后一个用于我的向导表单。

我已经在那些Html.EditorFor周围使用了重载的Html.BeginWizardForm()但是如何让MVC逻辑在Html.BeginWizardForm()中做出反应?

2 个答案:

答案 0 :(得分: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")
    
  3. 所有这一切,这里最大的问题是你似乎违反了良好的网页设计的核心原则。 HTML是关于结构,而不是表示。 CSS用于演示。因此,如果您希望在特定上下文中看起来有所不同,那么正确的方法是应用不同的CSS。如果设计得好,那么你的HTML不应该真的改变。

答案 1 :(得分:0)

似乎正如Chris Pratt所述,不可能有多个EditorTemplates。

然而,我找到了一个解决方法,扩展了MvcForm,并创建了一个WizardForm,它为ViewContext添加了一个值(在我的情况下" wizardContext" => true)和处理设置wizardContext =>假的。

这允许我在EditorTemplates中添加一个检查,如果我在wizardContext内部或外部,它将通过嵌套的EditorFor传播,并以这种方式允许我有不同的主题,而不必在EditorFor中具体。