예제 #1
0
        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 })}]");
            }
        }
예제 #2
0
        /// <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();
                }
            }
        }
예제 #3
0
        /// <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()));
        }
예제 #4
0
        /// <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)));
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
 internal static object?TryGeyValue(this DotvvmBindableObject control, DotvvmProperty property)
 {
     try
     {
         return(control.GetValue(property));
     }
     catch
     {
         return(property.DefaultValue);
     }
 }
예제 #7
0
        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 })}]");
        }
예제 #8
0
        /// <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));
        }
예제 #9
0
        /// <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());
        }
예제 #10
0
        /// <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);
        }
예제 #11
0
 /// Gets an expected data context type (usually determined by the compiler)
 public static DataContextStack GetDataContextType(this DotvvmBindableObject obj) => (DataContextStack)obj.GetValue(Internal.DataContextTypeProperty);
예제 #12
0
 /// <summary>
 /// Determines whether the specified control is a naming container.
 /// </summary>
 public static bool IsNamingContainer(DotvvmBindableObject control)
 {
     return((bool)control.GetValue(Internal.IsNamingContainerProperty));
 }
예제 #13
0
        /// <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());
        }