static string GenerateConcurrencyModeHandler(string propertyName, DotvvmBindableObject obj) { var mode = (obj.GetValue(PostBack.ConcurrencyProperty) as PostbackConcurrencyMode?) ?? PostbackConcurrencyMode.Default; // determine concurrency queue string queueName = null; var queueSettings = obj.GetValueRaw(PostBack.ConcurrencyQueueSettingsProperty) as ConcurrencyQueueSettingsCollection; if (queueSettings != null) { queueName = queueSettings.FirstOrDefault(q => string.Equals(q.EventName, propertyName, StringComparison.OrdinalIgnoreCase))?.ConcurrencyQueue; } if (queueName == null) { queueName = obj.GetValue(PostBack.ConcurrencyQueueProperty) as string ?? "default"; } // return the handler script if (mode == PostbackConcurrencyMode.Default && "default".Equals(queueName)) { return(null); } var handlerName = $"concurrency-{mode.ToString().ToLower()}"; if ("default".Equals(queueName)) { return(JsonConvert.ToString(handlerName)); } else { return($"[{JsonConvert.ToString(handlerName)},{GenerateHandlerOptions(obj, new Dictionary<string, object> { ["q"] = queueName })}]"); } }
/// <summary> /// Writes text iff the property contains hard-coded value OR /// writes knockout text binding iff the property contains binding /// </summary> /// <param name="writer">HTML output writer</param> /// <param name="obj">Dotvvm control which contains the <see cref="DotvvmProperty"/> with value to be written</param> /// <param name="property">Value of this property will be written</param> /// <param name="wrapperTag">Name of wrapper tag, null => knockout binding comment</param> public static void WriteTextOrBinding(this IHtmlWriter writer, DotvvmBindableObject obj, DotvvmProperty property, string wrapperTag = null) { var valueBinding = obj.GetValueBinding(property); if (valueBinding != null) { if (wrapperTag == null) { writer.WriteKnockoutDataBindComment("text", valueBinding.GetKnockoutBindingExpression(obj)); writer.WriteKnockoutDataBindEndComment(); } else { writer.AddKnockoutDataBind("text", valueBinding.GetKnockoutBindingExpression(obj)); writer.RenderBeginTag(wrapperTag); writer.RenderEndTag(); } } else { if (wrapperTag != null) { writer.RenderBeginTag(wrapperTag); } writer.WriteText(obj.GetValue(property).ToString()); if (wrapperTag != null) { writer.RenderEndTag(); } } }
/// <summary> /// Returns Javascript expression that represents the property value (even if the property contains hardcoded value) /// </summary> public static string GetKnockoutBindingExpression(this DotvvmBindableObject obj, DotvvmProperty property) { var binding = obj.GetValueBinding(property); if (binding != null) { return(binding.GetKnockoutBindingExpression(obj)); } return(JsonConvert.SerializeObject(obj.GetValue(property), DefaultViewModelSerializer.CreateDefaultSettings())); }
/// <summary> /// Returns Javascript expression that represents the property value (even if the property contains hardcoded value) /// </summary> public static string GetKnockoutBindingExpression(this DotvvmBindableObject obj, DotvvmProperty property) { var binding = obj.GetValueBinding(property); if (binding != null) { return(binding.GetKnockoutBindingExpression()); } return(JsonConvert.SerializeObject(obj.GetValue(property))); }
/// <summary> /// Gets the validation target expression. /// </summary> public static string GetValidationTargetExpression(DotvvmBindableObject control) { if (!(bool)control.GetValue(Validation.EnabledProperty)) { return(null); } return(control.GetValueBinding(Validation.TargetProperty)?.GetKnockoutBindingExpression(control) ?? RootValidationTargetExpression); }
internal static object?TryGeyValue(this DotvvmBindableObject control, DotvvmProperty property) { try { return(control.GetValue(property)); } catch { return(property.DefaultValue); } }
static string GenerateConcurrencyModeHandler(DotvvmBindableObject obj) { var mode = (obj.GetValue(PostBack.ConcurrencyProperty) as PostbackConcurrencyMode?) ?? PostbackConcurrencyMode.Default; var queueName = obj.GetValueRaw(PostBack.ConcurrencyQueueProperty) ?? "default"; if (mode == PostbackConcurrencyMode.Default && "default".Equals(queueName)) { return(null); } var handlerName = $"concurrency-{mode.ToString().ToLower()}"; if ("default".Equals(queueName)) { return(JsonConvert.ToString(handlerName)); } return($"[{JsonConvert.ToString(handlerName)},{GenerateHandlerOptions(obj, new Dictionary<string, object> { ["q"] = queueName })}]"); }
/// <summary> /// Gets the validation target expression. /// </summary> public static string GetValidationTargetExpression(DotvvmBindableObject control) { if (!(bool)control.GetValue(Validation.EnabledProperty)) { return(null); } // find the closest control var validationTargetControl = control.GetClosestControlValidationTarget(out var _); if (validationTargetControl == null) { return("$root"); } // reparent the expression to work in current DataContext return(validationTargetControl.GetValueBinding(Validation.TargetProperty).GetKnockoutBindingExpression(control)); }
/// <summary> /// Generates a list of postback update handlers. /// </summary> private static string GetPostBackHandlersScript(DotvvmBindableObject control, string eventName) { var handlers = (List <PostBackHandler>)control.GetValue(PostBack.HandlersProperty); if (handlers == null) { return("null"); } var effectiveHandlers = handlers.Where(h => string.IsNullOrEmpty(h.EventName) || h.EventName == eventName); var sb = new StringBuilder(); sb.Append("["); foreach (var handler in effectiveHandlers) { if (sb.Length > 1) { sb.Append(","); } sb.Append("{name:'"); sb.Append(handler.ClientHandlerName); sb.Append("',options:function(){return {"); var isFirst = true; var options = handler.GetHandlerOptionClientExpressions(); options.Add("enabled", handler.TranslateValueOrBinding(PostBackHandler.EnabledProperty)); foreach (var option in options) { if (!isFirst) { sb.Append(','); } isFirst = false; sb.Append(option.Key); sb.Append(":"); sb.Append(option.Value); } sb.Append("};}}"); } sb.Append("]"); return(sb.ToString()); }
/// <summary> /// Gets the validation target expression. /// </summary> public static string GetValidationTargetExpression(DotvvmBindableObject control) { if (!(bool)control.GetValue(Validation.EnabledProperty)) { return(null); } // find the closest control int dataSourceChanges; var validationTargetControl = control.GetClosestWithPropertyValue(out dataSourceChanges, c => c.IsPropertySet(Validation.TargetProperty, false)); if (validationTargetControl == null) { return("$root"); } // reparent the expression to work in current DataContext var validationBindingExpression = validationTargetControl.GetValueBinding(Validation.TargetProperty); string validationExpression = validationBindingExpression.GetKnockoutBindingExpression(); validationExpression = string.Join("", Enumerable.Range(0, dataSourceChanges).Select(i => "$parentContext.")) + validationExpression; return(validationExpression); }
/// Gets an expected data context type (usually determined by the compiler) public static DataContextStack GetDataContextType(this DotvvmBindableObject obj) => (DataContextStack)obj.GetValue(Internal.DataContextTypeProperty);
/// <summary> /// Determines whether the specified control is a naming container. /// </summary> public static bool IsNamingContainer(DotvvmBindableObject control) { return((bool)control.GetValue(Internal.IsNamingContainerProperty)); }
/// <summary> /// Generates a list of postback update handlers. /// </summary> private static string GetPostBackHandlersScript(DotvvmBindableObject control, string eventName, params string[] moreHandlers) { var handlers = (List <PostBackHandler>)control.GetValue(PostBack.HandlersProperty); if ((handlers == null || handlers.Count == 0) && (moreHandlers == null || moreHandlers.Length == 0)) { return("[]"); } var sb = new StringBuilder(); sb.Append('['); if (handlers != null) { foreach (var handler in handlers) { if (!string.IsNullOrEmpty(handler.EventName) && handler.EventName != eventName) { continue; } var options = handler.GetHandlerOptions(); var name = handler.ClientHandlerName; if (handler.GetValueBinding(PostBackHandler.EnabledProperty) is IValueBinding binding) { options.Add("enabled", binding); } else if (!handler.Enabled) { continue; } if (sb.Length > 1) { sb.Append(','); } if (options.Count == 0) { sb.Append(JsonConvert.ToString(name)); } else { string script = GenerateHandlerOptions(handler, options); sb.Append("["); sb.Append(JsonConvert.ToString(name)); sb.Append(","); sb.Append(script); sb.Append("]"); } } } if (moreHandlers != null) { foreach (var h in moreHandlers) { if (h != null) { if (sb.Length > 1) { sb.Append(','); } sb.Append(h); } } } sb.Append(']'); return(sb.ToString()); }