如何为模板重用 Kendo UI 组件?属性“.name”为多个 HTML 元素在 DOM 中提供完全相同的 ID

Posted

技术标签:

【中文标题】如何为模板重用 Kendo UI 组件?属性“.name”为多个 HTML 元素在 DOM 中提供完全相同的 ID【英文标题】:How to reuse Kendo UI Components for a template? Attribute ".name" gives multiple HTML-elements the exact same ID in the DOM 【发布时间】:2017-04-12 06:31:16 【问题描述】:

我想创建一个可重复使用的 Kendo UI 按钮和下拉菜单模板。

目的是拥有 1 个 Template.cshtml 文件,并在我想使用它们的任何地方隐藏/显示该文件的某些部分。

一些功能(点击按钮)是常用的,因此需要检查某些 html 元素的可见性。其他功能(下拉菜单的选择)在整个应用程序中只会使用一次或两次。但是我仍然希望在我的模板中使用这些很少使用的组件,并且显示将设置为“无”。

为了在我的 ASP.NET MVC 应用程序中实现模板,我使用的是 razor 语法:

@Html.Action("myTemplate", "Controller")

此操作返回我的部分视图:

    public ActionResult myTemplate()
    
        return PartialView("Template");
    

在我看来,我在 Kendo UI 演示页面中使用此示例代码在 ASP.NET MVC 语法中:http://demos.telerik.com/aspnet-mvc/dropdownlist/index

模板.cshtml

@(Html.Kendo().DropDownList()
      .Name("color")                       // this sets the elements ID in the DOM
      .DataTextField("Text")
      .DataValueField("Value")
      .Events(e => e.Change("change"))
      .BindTo(new List<SelectListItem>() 
          new SelectListItem() 
              Text = "Black",
              Value = "1"
          ,
          new SelectListItem() 
              Text = "Orange",
              Value = "2"
          ,
          new SelectListItem() 
              Text = "Grey",
              Value = "3"
          
      )
      .Value("1")
      .HtmlAttributes(new  style = "width: 100%" )
) 

如果我只在整个应用程序中使用一次,我的模板就可以正常工作(这与“模板”的目的相反)。

如果我在同一页面上使用我的模板两次(或更频繁),那么 ID #color 会在同一页面上使用多次。

这是我想使用我的模板的方式:

    我确实需要多次重用我的模板(远不止一次)。模板的某些元素(按钮、下拉菜单等)在 DOM 的某些部分将设置为“显示:无”。 如果我需要模板的一些元素,那么我想嵌入整个模板并显示我需要的内容并隐藏我不需要的元素。 我的模板中的一些元素是“通用的”,并且会使用通用的 javascript 函数。我的模板的其他部分将只有 1 个指定功能(onclick),它们几乎一直设置为“显示:无”。 我不想在 DOM 中多次使用 ID 如果在 DOM 中多次使用类,我没有问题

【问题讨论】:

【参考方案1】:

我能够做到这一点如下: 1.创建一个名为color.cs的模型

    public class Color
    
        public string Name  get; set; 
    

    控制器

    public ActionResult MultipleControls()
    
        var colors = new List<Color>();
        colors.Add(new Color()  Name = "Pink0");
        colors.Add(new Color()  Name = "Pink1" );
        colors.Add(new Color()  Name = "Pink2" );
        colors.Add(new Color()  Name = "Pink3" );
        return View(colors);
    
    

    MultipleControls.cshtml 页面。在此页面中,您可以提供一个唯一的名称,因为我正在连接每种颜色的名称。

     @using Kendo.Mvc.UI
     @model List<WebApplication1.Models.Color>
    
     @foreach (var color in Model)
     
         @Html.EditorFor(x => color,"Color"+color.Name)
       
    

    创建以下 EditorTemplate Color.cshtml。模板 .Name 属性使用@Model.Name,因此它每次都会生成一个唯一的 id。

     @using Kendo.Mvc.UI
     @model WebApplication1.Models.Color   
    
     @(Html.Kendo().DropDownList()
      .Name(@Model.Name)
      .DataTextField("Text")
      .DataValueField("Value")
      .Events(e => e.Change("change"))
      .BindTo(new List<SelectListItem>() 
          new SelectListItem() 
              Text = "Black",
              Value = "1"
          ,
          new SelectListItem() 
              Text = "Orange",
              Value = "2"
          ,
          new SelectListItem() 
              Text = "Grey",
              Value = "3"
          
      )
      .Value("1")
      .HtmlAttributes(new  style = "width: 100%")
       )
    

【讨论】:

【参考方案2】:

我知道这个答案已经晚了,但我刚刚解决了这个问题,所以我想我会留下我的解决方案 在这里供未来的观众观看。

ViewBag 可用于传入名称。

在 Template.cshtml 中:

@(Html.Kendo().DropDownList() .Name(ViewBag.Name)

在包含视图中:

@Html.EditorFor(m =&gt; m.someProperty, "Template", new Name = "mycontrol" )

【讨论】:

以上是关于如何为模板重用 Kendo UI 组件?属性“.name”为多个 HTML 元素在 DOM 中提供完全相同的 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Kendo UI jQuery 的电子表格重新加载数据?

如何为 Kendo UI 自动完成控件设置宽度

如何为 Kendo UI 日期列 _filter_ 的 DatePicker 设置日期格式

Kendo DataSource:如何为从远程 odata 源读取的数据定义“计算”属性

您如何为 angularjs 可重用组件打包资产?

Kendo UI 数字格式无效的模板