剑道和 MVC 风格的模板
本文关键字:风格 MVC | 更新日期: 2023-09-27 18:31:03
我正在尝试弄清楚如何让剑道UI像MVC一样运行。当我渲染模板时,我想将元数据与模型一起传递,然后为给定模型生成正确的输出。
例如,在MVC中,我会这样做...
//define a custom object.cshtml in editortemplates within views
@if (ViewData.TemplateInfo.TemplateDepth < 2)
{
foreach (var prop in ViewData.ModelMetadata.Properties
.Where(metadata => metadata.ShowForEdit && !metadata.IsComplexType && !ViewData.TemplateInfo.Visited(metadata)))
{
<li>
@Html.Label(prop.PropertyName)
<div class="value">
@Html.Editor(prop.PropertyName, prop.TemplateHint, new { @class = "k-input" })
</div>
</li>
}
}
//In any view after defining the above
<ul>
@html.EditorFor(m => m)
</ul>
这将吐出一个控件列表,这些控件在编辑并回发到服务器时映射回对象并可以保存。这些控件将具有所有正确的属性来处理挂钩验证并定义为正确的类型,因此布尔值将是一个复选框,字符串将是一个文本框或文本区域,具体取决于元数据。
在剑道中,我想产生相同的结果,所以...这是我到目前为止所拥有的:
我定义了这样的模板,用于为任何任意对象渲染编辑器......
<script id="editor" type="text/x-kendo-template">
# var meta = getType(data.type) #
<h2><span class="k-sprite edit"></span> #: meta.DisplayName #: <span data-bind="text:ID">#: data.ID #</span> <img src="@Url.Content("~/Content/close.png")" /></h2>
<ul class="fieldList">
# for(i in data) { #
# var prop = meta.getProperty(i) #
# if(prop != null && getTemplate(prop.Template) != null) { #
<li>
<label class="fieldLabel">#: prop.DisplayName #</label>
#= renderTemplate('editable' + prop.Template, data[prop.PropertyName]) #
</li>
# }} #
</ul>
<hr />
<button class="k-button">Save</button>
</script>
然后,我根据我在 prop 中找到的值定义了单独的模板。模板,这是 .Net 类型名称或 mvc 的 uihint 属性的值(服务器计算此值)。
在根编辑器级别模板上都很好,但是在每个字段中我都有一个模型,但不知道如何在此处定义变量 prop,该变量 prop 表示该类型对象上该属性的元数据,以便我可以确定如何正确呈现控件。
Telerik 支持建议让服务器使用 MVC 为每个类型生成一个编辑器模板,但这感觉是错误的,并且违背了我在这里的目标,即让应用程序在初始加载后(大部分)只是要求数据,就像 MVC 在服务器上所做的那样。有什么想法吗?
这永远行不通,原因:
Javascript和kendo没有类型的概念,所以元数据在那个环境中怎么可能是一个可行的概念。
在这里要学习的教训:在 js 中模板不是 MVC 允许我们做的一半,而且永远不会是由于语言的限制。
我通过在服务器上模板化对象,然后将整个对象绑定到 MVC 中由 razor 生成的剑道模板来解决此问题。