【问题标题】:Customize not only editor template but the outer html不仅可以自定义编辑器模板,还可以自定义外部 html
【发布时间】:2013-05-01 12:38:30
【问题描述】:

在 MVC.Net 3 中,我可以自定义使用 EditorTemplate 呈现字符串和其他原始类型的方式。

例如,如果我有一个EditorTemplates/String.cshtml

@Html.TextBox("")

我得到了默认渲染。 考虑简单的模型:

class Foo
{
   public string Route {get; set; }
}

表单的呈现会产生如下内容:

<div class="editor-label"><label for="Route">Test Route</label></div>
<div class="editor-field">
   <input data-val="true" data-val-required="The Test Route field is required." id="Route" name="Route" type="text"> 
   <span class="field-validation-valid" data-valmsg-for="Route" data-valmsg-replace="true"></span>
</div>

问题是:使用 String.chtml 我只能自定义 div editor-field 的内部 html。如何自定义 div 本身以添加 css 类和其他属性?

谢谢

【问题讨论】:

    标签: c# asp.net-mvc-3 template-engine


    【解决方案1】:

    您需要在您的Shared/EditorTemplates/ 文件夹中实现自定义object.cshtml

    请参阅this questionthis one 了解一些示例实现

    【讨论】:

    • 好的,覆盖对象模板似乎是解决方案。在我看来,默认的对象模板湖具有灵活性。
    【解决方案2】:

    有两种方法可以定制您需要的内容。

    1. 为您的模型对象Foo 添加一个编辑器模板。这种方式导致模板和模型之间的耦合连接。模型中的每一项更改都必须应用于模板。
    2. 通过在Views/ControllerName/EditorTemplatesViews/Shared/EditorTemplates 中添加Object.cshtm 来覆盖内部对象模板。这是更通用的和松散的耦合。

    有关自定义对象模板视图的更多信息this 链接。

    已编辑:

    Object.cshtml 中,您可以检查 Foo 模型并应用 Foo 的特定自定义。

     @if (Model is Foo)
     {
        //specific customization for the Foo
     }
    

    【讨论】:

      【解决方案3】:

      这是扩展方法EditorFor 有用的地方。如果您使用EditorFor,您在模板中包含的任何标记(例如String.cshmlt)都将被写出。所以你可以在你的模板中有这个:

      // you can basically do whatever you want here  
      // add some label, span, etc.
      <div class="some-class">
          <div class="another-class">
              @Html.TextBox(string.Empty, /* Name suffix */
                  ViewData.TemplateInfo.FormattedModelValue /* Initial value */
              )
          </div>
      </div>
      

      然后让视图引擎渲染它:

      @Html.EditoFor(m=>m.Route)
      

      【讨论】:

      • 感谢您的建议,但这意味着对我的模型的每个属性都使用 EditorFor,这不是一个选项。我最终会得到一个高度耦合的视图/模型。
      • 您的视图和模型不会紧密耦合,因为您可以随时将 editorfor 与 textboxfor 或任何其他 htmlhelper 交换。紧密耦合意味着您将无法在模型中使用任何 htmlhelper。
      • 无意冒犯,但我对耦合的定义不同。耦合意味着 A 中的更改会强制 B 中的更改。例如,当我在模型中添加属性时,我需要修改视图以考虑新属性。相反,如果我只使用 EditorForModel,则会自动考虑该属性。这就是我想要避免的。
      • 我认为我们的想法相同,只是举了不同的例子。所以,EditorFor 应用于单个属性,我想你知道。 EditForModel 是另一回事。如果您更改模型属性中的某些内容,它将如何影响模板?如果您更改模板,这将如何影响模型的属性?我想他们两个都不在乎别人的样子。所以那里没有紧耦合,不是吗?
      • 好的,让我更准确地说明我在做什么。我正在使用 EditorForModel(anInstanceOfFoo)。如果这样做,我将无法更改每个字段的呈现方式。我得到了div,但我无法向它添加 CSS 类。并且使用 EditorTemplate 并没有帮助。因为EditorTemplate 只允许你指定编辑器字段div 的内部html。希望我说得更清楚
      【解决方案4】:

      所有发布的答案都是有效的,但可能会过度设计解决方案。如果您担心避免紧耦合,您可以保留 von v 的答案中描述的编辑器模板通用,并通过模板的 ViewData 集合向其传递其他参数。例如,如果你有一串额外的类,你想追加到外部 div...

      @if (ViewData.ContainsKey("additionalClasses"))
      {
          /* Append classes to div */
      }
      else 
      {
          /* Div without classes */
      }
      

      现在,您可以从主视图中传入additionalClasses,如下所示:

      @EditorFor(m => m.Route, "MyTemplate", new { additionalClasses = "myclass" })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-18
        • 2011-06-15
        • 1970-01-01
        • 1970-01-01
        • 2017-11-26
        相关资源
        最近更新 更多