public static IBindingsBuilder <T> Template <T, F>( this IBindingsBuilder <T> bindingsBuilder, string templateName, Expression <Func <T, F> > expression, string afterAdd = null, string beforeRemove = null, string afterRender = null, object templateOptions = null, string prefix = null, bool applyClientValidation = true, bool fastNoJavaScript = false, string afterAllRender = null, string templateEngine = null) where T : class { if (expression == null) { throw (new ArgumentNullException("expression")); } if (string.IsNullOrWhiteSpace(templateName)) { throw (new ArgumentNullException("templateName")); } string format = null; string actualPrefix = BasicHtmlHelper.AddField( bindingsBuilder.ModelPrefix, ExpressionHelper.GetExpressionText(expression)); if (prefix == null) { prefix = actualPrefix; } StringBuilder sb = new StringBuilder(); if (templateName[0] != '@') { sb.Append("template: { name: ""); sb.Append(templateName); if (typeof(IEnumerable).IsAssignableFrom(typeof(F))) { sb.Append("", foreach: "); } else { sb.Append("", data: "); } } else { templateName = templateName.Substring(1); sb.Append("template: { name: "); sb.Append(templateName); if (typeof(IEnumerable).IsAssignableFrom(typeof(F))) { sb.Append(", foreach: "); } else { sb.Append(", data: "); } } sb.Append(bindingsBuilder.GetFullBindingName(expression)); if (afterRender != null) { sb.Append(", afterRender: "); sb.Append(afterRender); } if (afterAdd != null) { sb.Append(", afterAdd: "); sb.Append(afterAdd); } if (beforeRemove != null) { sb.Append(", beforeRemove: "); sb.Append(beforeRemove); } if (afterAllRender != null) { sb.Append(", afterAllRender: "); sb.Append(afterAllRender); } if (templateEngine != null) { sb.Append(", templateEngine: ko."); sb.Append(templateEngine); sb.Append(".instance"); } var additionalOptions = new { ModelPrefix = """ + prefix + """, ModelId = """ + BasicHtmlHelper.IdFromName(prefix) + """, ItemPrefix = """", templateSymbol = """ + ClientTemplateHelper.templateSymbol + "0"" }; sb.Append(", templateOptions: {"); if (templateOptions != null) { sb.Append(BasicHtmlHelper.TranslateAnonymous(templateOptions)); sb.Append(", "); } sb.Append(BasicHtmlHelper.TranslateAnonymous(additionalOptions)); sb.Append(" }"); sb.Append(", processingOptions: {"); if (bindingsBuilder.ValidationType == "UnobtrusiveClient") { sb.Append("unobtrusiveClient: true"); if (bindingsBuilder.GetHelper().ViewData["_TemplateLevel_"] == null) { bindingsBuilder.AddServerErrors(actualPrefix); } } else { sb.Append("unobtrusiveClient: false"); } sb.Append(fastNoJavaScript ? ", fastNoJavaScript: true" : ", fastNoJavaScript: false"); sb.Append(applyClientValidation ? ", applyClientValidation: true" : ", applyClientValidation: false"); sb.Append(" }"); sb.Append(" }"); format = sb.ToString(); bindingsBuilder.Add( format ); return(bindingsBuilder); }