public static string GenerateClientPostBackExpression(string propertyName, ICommandBinding expression, DotvvmBindableObject control, PostbackScriptOptions options) { var target = (DotvvmControl?)control.GetClosestControlBindingTarget(); var uniqueControlId = target?.GetDotvvmUniqueId(); string getContextPath(DotvvmBindableObject?current) { var result = new List <string>(); while (current != null) { var pathFragment = current.GetDataContextPathFragment(); if (pathFragment != null) { result.Add(JsonConvert.ToString(pathFragment)); } current = current.Parent; } result.Reverse(); return("[" + string.Join(",", result) + "]"); } string getHandlerScript() { if (!options.AllowPostbackHandlers) { return("[]"); } // turn validation off for static commands var validationPath = expression is StaticCommandBindingExpression ? null : GetValidationTargetExpression(control); return(GetPostBackHandlersScript(control, propertyName, // validation handler validationPath == null ? null : validationPath == RootValidationTargetExpression ? "\"validate-root\"" : validationPath == "$data" ? "\"validate-this\"" : $"[\"validate\", {{path:{JsonConvert.ToString(validationPath)}}}]", // use window.setTimeout options.UseWindowSetTimeout ? "\"timeout\"" : null, options.IsOnChange ? "\"suppressOnUpdating\"" : null, GenerateConcurrencyModeHandler(propertyName, control) )); } string?generatedPostbackHandlers = null; var adjustedExpression = expression.GetParametrizedCommandJavascript(control); // when the expression changes the dataContext, we need to override the default knockout context fo the command binding. var knockoutContext = options.KoContext ?? ( // adjustedExpression != expression.CommandJavascript ? new CodeParameterAssignment(new ParametrizedCode.Builder { "ko.contextFor(", options.ElementAccessor.Code !, ")" }.Build(OperatorPrecedence.Max))
public static string GenerateClientPostBackScript(string propertyName, ICommandBinding expression, DotvvmControl control, PostbackScriptOptions options) { object uniqueControlId = null; if (expression is ControlCommandBindingExpression) { var target = (DotvvmControl)control.GetClosestControlBindingTarget(); uniqueControlId = target.GetDotvvmUniqueId(); } var arguments = new List <string>() { "'root'", options.ElementAccessor, "[" + String.Join(", ", GetContextPath(control).Reverse().Select(p => '"' + p + '"')) + "]", (uniqueControlId is IValueBinding ? "{ expr: " + JsonConvert.ToString(((IValueBinding)uniqueControlId).GetKnockoutBindingExpression(), '\'', StringEscapeHandling.Default) + "}" : "'" + (string)uniqueControlId + "'"), options.UseWindowSetTimeout ? "true" : "false", JsonConvert.SerializeObject(GetValidationTargetExpression(control)), "null", GetPostBackHandlersScript(control, propertyName) }; // return the script var condition = options.IsOnChange ? "if (!dotvvm.isViewModelUpdating) " : null; var returnStatement = options.ReturnValue != null ? $";return {options.ReturnValue.ToString().ToLower()};" : ""; // call the function returned from binding js with runtime arguments var postBackCall = $"{expression.GetCommandJavascript()}({String.Join(", ", arguments)})"; return(condition + postBackCall + returnStatement); }
public static string GenerateClientPostBackScript(string propertyName, ICommandBinding expression, DotvvmBindableObject control, PostbackScriptOptions options) { var expr = GenerateClientPostBackExpression(propertyName, expression, control, options); if (options.ReturnValue == false) { return(expr + ";event.stopPropagation();return false;"); } else { return(expr); } }
public static string GenerateClientPostBackScript(string propertyName, ICommandBinding expression, DotvvmBindableObject control, PostbackScriptOptions options) { var target = (DotvvmControl)control.GetClosestControlBindingTarget(); var uniqueControlId = target?.GetDotvvmUniqueId(); // return the script string returnStatement; if (options.ReturnValue == false) { returnStatement = ";event.stopPropagation();return false;"; } else { returnStatement = ""; } string generatedPostbackHanlders = null; var call = expression.GetParametrizedCommandJavascript(control).ToString(p => p == CommandBindingExpression.ViewModelNameParameter ? new CodeParameterAssignment("'root'", OperatorPrecedence.Max) : p == CommandBindingExpression.SenderElementParameter ? options.ElementAccessor : p == CommandBindingExpression.CurrentPathParameter ? new CodeParameterAssignment( "[" + String.Join(", ", GetContextPath(control).Reverse().Select(JavascriptCompilationHelper.CompileConstant)) + "]", OperatorPrecedence.Max) : p == CommandBindingExpression.ControlUniqueIdParameter ? new CodeParameterAssignment( (uniqueControlId is IValueBinding ? "{ expr: " + JsonConvert.ToString(((IValueBinding)uniqueControlId).GetKnockoutBindingExpression(control), '\'', StringEscapeHandling.Default) + "}" : "'" + (string)uniqueControlId + "'"), OperatorPrecedence.Max) : p == CommandBindingExpression.UseObjectSetTimeoutParameter ? new CodeParameterAssignment(options.UseWindowSetTimeout ? "true" : "false", OperatorPrecedence.Max) : p == CommandBindingExpression.ValidationPathParameter ? CodeParameterAssignment.FromExpression(new JsLiteral(GetValidationTargetExpression(control))) : p == CommandBindingExpression.OptionalKnockoutContextParameter ? options.KoContext ?? new CodeParameterAssignment("null", OperatorPrecedence.Max) : p == CommandBindingExpression.CommandArgumentsParameter ? options.CommandArgs ?? new CodeParameterAssignment("undefined", OperatorPrecedence.Max) : p == CommandBindingExpression.PostbackHandlersParameter ? new CodeParameterAssignment(generatedPostbackHanlders ?? (generatedPostbackHanlders = GetPostBackHandlersScript(control, propertyName)), OperatorPrecedence.Max) : default(CodeParameterAssignment) ); if (generatedPostbackHanlders == null) { call = $"dotvvm.applyPostbackHandlers(function(){{return {call}}}.bind(this),{options.ElementAccessor.Code.ToString(e => default(CodeParameterAssignment))},{GetPostBackHandlersScript(control, propertyName)})"; } if (options.IsOnChange) { call = "if(!dotvvm.isViewModelUpdating){" + call + "}"; } return(call + returnStatement); }
public static string GenerateClientPostBackScript(string propertyName, ICommandBinding expression, DotvvmControl control, PostbackScriptOptions options) { object uniqueControlId = null; if (expression is ControlCommandBindingExpression) { var target = (DotvvmControl)control.GetClosestControlBindingTarget(); uniqueControlId = target.GetDotvvmUniqueId() as string; } var arguments = new List<string>() { "'root'", options.ElementAccessor, "[" + String.Join(", ", GetContextPath(control).Reverse().Select(p => '"' + p + '"')) + "]", (uniqueControlId is IValueBinding ? ((IValueBinding)uniqueControlId).GetKnockoutBindingExpression() : "'" + (string) uniqueControlId + "'"), options.UseWindowSetTimeout ? "true" : "false", JsonConvert.SerializeObject(GetValidationTargetExpression(control)), "null", GetPostBackHandlersScript(control, propertyName) }; // return the script var condition = options.IsOnChange ? "if (!dotvvm.isViewModelUpdating) " : null; var returnStatement = options.ReturnValue != null ? $";return {options.ReturnValue.ToString().ToLower()};" : ""; // call the function returned from binding js with runtime arguments var postBackCall = $"{expression.GetCommandJavascript()}({String.Join(", ", arguments)})"; return condition + postBackCall + returnStatement; }
public static string GenerateClientPostBackExpression(string propertyName, ICommandBinding expression, DotvvmBindableObject control, PostbackScriptOptions options) { var target = (DotvvmControl)control.GetClosestControlBindingTarget(); var uniqueControlId = target?.GetDotvvmUniqueId(); string getContextPath(DotvvmBindableObject current) { var result = new List <string>(); while (current != null) { var pathFragment = current.GetDataContextPathFragment(); if (pathFragment != null) { result.Add(JsonConvert.ToString(pathFragment)); } current = current.Parent; } result.Reverse(); return("[" + string.Join(",", result) + "]"); } string getHandlerScript() { if (!options.AllowPostbackHandlers) { return("[]"); } // turn validation off for static commands var validationPath = expression is StaticCommandBindingExpression ? null : GetValidationTargetExpression(control); return(GetPostBackHandlersScript(control, propertyName, // validation handler validationPath == null ? null : validationPath == RootValidationTargetExpression ? "\"validate-root\"" : validationPath == "$data" ? "\"validate-this\"" : $"[\"validate\", {{path:{JsonConvert.ToString(validationPath)}}}]", // use window.setTimeout options.UseWindowSetTimeout ? "\"timeout\"" : null, options.IsOnChange ? "\"suppressOnUpdating\"" : null, GenerateConcurrencyModeHandler(control) )); } string generatedPostbackHandlers = null; var adjustedExpression = expression.GetParametrizedCommandJavascript(control); // when the expression changes the dataContext, we need to override the default knockout context fo the command binding. var knockoutContext = options.KoContext ?? ( adjustedExpression != expression.CommandJavascript ? new CodeParameterAssignment(new ParametrizedCode.Builder { "ko.contextFor(", options.ElementAccessor.Code, ")" }.Build(OperatorPrecedence.Max)) : default); var call = adjustedExpression.ToString(p => p == CommandBindingExpression.ViewModelNameParameter ? new CodeParameterAssignment("\"root\"", OperatorPrecedence.Max) : p == CommandBindingExpression.SenderElementParameter ? options.ElementAccessor : p == CommandBindingExpression.CurrentPathParameter ? new CodeParameterAssignment( getContextPath(control), OperatorPrecedence.Max) : p == CommandBindingExpression.ControlUniqueIdParameter ? new CodeParameterAssignment( (uniqueControlId is IValueBinding ? "{ expr: " + JsonConvert.ToString(((IValueBinding)uniqueControlId).GetKnockoutBindingExpression(control)) + "}" : '"' + (string)uniqueControlId + '"'), OperatorPrecedence.Max) : p == JavascriptTranslator.KnockoutContextParameter ? knockoutContext : p == CommandBindingExpression.CommandArgumentsParameter ? options.CommandArgs ?? default : p == CommandBindingExpression.PostbackHandlersParameter ? new CodeParameterAssignment(generatedPostbackHandlers ?? (generatedPostbackHandlers = getHandlerScript()), OperatorPrecedence.Max) : default(CodeParameterAssignment) ); if (generatedPostbackHandlers == null && options.AllowPostbackHandlers) { return($"dotvvm.applyPostbackHandlers(function(){{return {call}}}.bind(this),{options.ElementAccessor.Code.ToString(e => default(CodeParameterAssignment))},{getHandlerScript()})"); } else { return(call); } }
public static string GenerateClientPostBackExpression(string propertyName, ICommandBinding expression, DotvvmBindableObject control, PostbackScriptOptions options) { var target = (DotvvmControl)control.GetClosestControlBindingTarget(); var uniqueControlId = target?.GetDotvvmUniqueId(); string getHandlerScript() { // turn validation off for static commands var validationPath = expression is StaticCommandBindingExpression ? null : GetValidationTargetExpression(control); return(GetPostBackHandlersScript(control, propertyName, // validation handler validationPath == null ? null : validationPath == RootValidationTargetExpression ? "\"validate-root\"" : validationPath == "$data" ? "\"validate-this\"" : $"[\"validate\", {{path:{JsonConvert.ToString(validationPath)}}}]", // use window.setTimeout options.UseWindowSetTimeout ? "\"timeout\"" : null, options.IsOnChange ? "\"suppressOnUpdating\"" : null, GenerateConcurrencyModeHandler(control) )); } string generatedPostbackHandlers = null; var call = expression.GetParametrizedCommandJavascript(control).ToString(p => p == CommandBindingExpression.ViewModelNameParameter ? new CodeParameterAssignment("\"root\"", OperatorPrecedence.Max) : p == CommandBindingExpression.SenderElementParameter ? options.ElementAccessor : p == CommandBindingExpression.CurrentPathParameter ? new CodeParameterAssignment( "[" + String.Join(", ", GetContextPath(control).Reverse().Select(JavascriptCompilationHelper.CompileConstant)) + "]", OperatorPrecedence.Max) : p == CommandBindingExpression.ControlUniqueIdParameter ? new CodeParameterAssignment( (uniqueControlId is IValueBinding ? "{ expr: " + JsonConvert.ToString(((IValueBinding)uniqueControlId).GetKnockoutBindingExpression(control)) + "}" : '"' + (string)uniqueControlId + '"'), OperatorPrecedence.Max) : p == CommandBindingExpression.OptionalKnockoutContextParameter ? options.KoContext ?? new CodeParameterAssignment("null", OperatorPrecedence.Max) : p == CommandBindingExpression.CommandArgumentsParameter ? options.CommandArgs ?? new CodeParameterAssignment("undefined", OperatorPrecedence.Max) : p == CommandBindingExpression.PostbackHandlersParameter ? new CodeParameterAssignment(generatedPostbackHandlers ?? (generatedPostbackHandlers = getHandlerScript()), OperatorPrecedence.Max) : default(CodeParameterAssignment) ); if (generatedPostbackHandlers == null) { return($"dotvvm.applyPostbackHandlers(function(){{return {call}}}.bind(this),{options.ElementAccessor.Code.ToString(e => default(CodeParameterAssignment))},{getHandlerScript()})"); } else { return(call); } }
public static string GenerateClientPostBackScript(string propertyName, ICommandBinding expression, DotvvmControl control, PostbackScriptOptions options) { object uniqueControlId = null; var target = (DotvvmControl)control.GetClosestControlBindingTarget(); uniqueControlId = target?.GetDotvvmUniqueId(); var arguments = new List <string>() { "'root'", options.ElementAccessor, "[" + string.Join(", ", GetContextPath(control).Reverse().Select(p => '"' + p + '"')) + "]", (uniqueControlId is IValueBinding ? "{ expr: " + JsonConvert.ToString(((IValueBinding)uniqueControlId).GetKnockoutBindingExpression(), '\'', StringEscapeHandling.Default) + "}" : "'" + (string)uniqueControlId + "'"), options.UseWindowSetTimeout ? "true" : "false", JsonConvert.SerializeObject(GetValidationTargetExpression(control)), "null", GetPostBackHandlersScript(control, propertyName) }; // return the script var returnStatement = options.ReturnValue != null ? $";return {options.ReturnValue.ToString().ToLower()};" : ""; if (expression is StaticCommandBindingExpression) { if (arguments.Last() != "null" && arguments.Last() != "[]") { throw new NotSupportedException($"PostBack.Handlers are not supported for staticCommand binding"); } // static command only requires the first argument arguments.RemoveRange(1, arguments.Count - 1); } // call the function returned from binding js with runtime arguments var postBackCall = $"{expression.GetCommandJavascript()}({string.Join(", ", arguments)})"; if (options.UseWindowSetTimeout && expression is StaticCommandBindingExpression) { postBackCall = "setTimeout(function(){" + postBackCall + "}.bind(this),0)"; } if (options.IsOnChange) { postBackCall = $"if(!dotvvm.isViewModelUpdating){{{postBackCall}}}"; } return(postBackCall + returnStatement); }