public void BindValue(object value) { var parent = _targetElement.Parent(); if (parent == null) { throw new NotSupportedException(); } var text = (string)value; if (parent.ElementTextMode() == TextMode.Preformated) { parent.AddTextNode(_targetElement.NodesIndexOfSelf(), HtmlEncoding.HtmlEncode(text)); _targetElement.Remove(); } else { var encoded = HtmlEncoding.HtmlEncode(text); encoded = encoded.Replace(" ", " "); if (encoded.EndsWith(" ")) { encoded = encoded.Substring(0, encoded.Length - 1) + " ";//如果末尾多出一个空格,则替换为 } encoded = encoded.Replace("\r\n", "\n").Replace("\r", "\n"); encoded = encoded.Replace("\n", "<br />"); _targetElement.ReplaceWith(encoded); } }
protected bool BindExpressionElement(IHtmlElement element) { var expression = new ElementExpression(element); var expressionBinder = GetExpressionBinder(expression) as IElementExpressionBinder; if (expressionBinder == null) { return(false); } var value = expressionBinder.GetValue(this, expression); if (value == null) { element.Remove(); } else { element.ReplaceWith(HttpUtility.HtmlEncode(value)); } return(true); }
/// <summary> /// 对元素进行数据绑定 /// </summary> /// <param name="element">需要绑定数据的元素</param> /// <param name="context">绑定上下文</param> /// <param name="dataContext">数据上下文</param> /// <returns>是否进行了绑定</returns> public bool BindElement( IHtmlElement element, HtmlBindingContext context, out object dataContext ) { dataContext = null; if ( element.Attribute( "binding-visible" ) != null ) { var visible = element.Attribute( "binding-visible" ).Value(); if ( visible.EqualsIgnoreCase( "false" ) || visible.EqualsIgnoreCase( "hidden" ) || visible.EqualsIgnoreCase( "invisible" ) ) element.Remove(); return true; } //处理样式类 { var classAttribute = element.Attribute( classAttributeName ); if ( classAttribute != null ) { if ( !string.IsNullOrWhiteSpace( classAttribute.AttributeValue ) ) { var classes = Regulars.whiteSpaceSeparatorRegex.Split( classAttribute.AttributeValue ).Where( c => c != "" ).ToArray(); if ( classes.Any() ) element.Class( classes ); } element.RemoveAttribute( classAttributeName ); } } //处理CSS样式 var styleAttributes = element.Attributes().Where( a => a.Name.StartsWith( styleAttributePrefix ) ).ToArray(); if ( styleAttributes.Any() ) BindElementStyles( element, styleAttributes ); if ( !element.Name.EqualsIgnoreCase( "view" ) && !element.Name.EqualsIgnoreCase( "binding" ) ) { var dataContextExpression = AttributeExpression.ParseExpression( element.Attribute( "datacontext" ) ); if ( dataContextExpression != null ) dataContext = GetDataObject( dataContextExpression, context ); return false; } var expression = new AttributeExpression( element ); object dataObject = GetDataObject( expression, context ); if ( dataObject == null ) return false; var format = element.Attribute( "format" ).Value(); //绑定到客户端脚本对象 var variableName = element.Attribute( "var" ).Value() ?? element.Attribute( "variable" ).Value(); if ( variableName != null ) { if ( format != null ) dataObject = string.Format( format, dataObject ); var hostName = element.Attribute( "host" ).Value(); var script = (string) null; if ( hostName == null ) script = string.Format( "(function(){{ this['{0}'] = {1} }})();", variableName, ToJson( dataObject ) ); else script = string.Format( "(function(){{ this['{0}'] = {1} }})();", variableName, ToJson( dataObject ) ); element.ReplaceWith( string.Format( "<script type=\"text/javascript\">{0}</script>", script ) ); return true; } //绑定为 HTML 文本 var bindValue = string.Format( format ?? "{0}", dataObject ); var attributeName = element.Attribute( "attribute" ).Value() ?? element.Attribute( "attr" ).Value(); if ( attributeName != null ) { var nextElement = element.NextElement(); if ( nextElement == null ) return false; nextElement.SetAttribute( attributeName, bindValue ); return true; } element.ReplaceWith( bindValue ); return true; }
/// <summary> /// 对元素进行数据绑定 /// </summary> /// <param name="element">需要绑定数据的元素</param> /// <param name="context">绑定上下文</param> /// <param name="dataContext">数据上下文</param> /// <returns>是否进行了绑定</returns> public bool BindElement(IHtmlElement element, HtmlBindingContext context, out object dataContext) { dataContext = null; if (element.Attribute("binding-visible") != null) { var visible = element.Attribute("binding-visible").Value(); if (visible.EqualsIgnoreCase("false") || visible.EqualsIgnoreCase("hidden") || visible.EqualsIgnoreCase("invisible")) { element.Remove(); } return(true); } //处理样式类 { var classAttribute = element.Attribute(classAttributeName); if (classAttribute != null) { if (!string.IsNullOrWhiteSpace(classAttribute.AttributeValue)) { var classes = Regulars.whiteSpaceSeparatorRegex.Split(classAttribute.AttributeValue).Where(c => c != "").ToArray(); if (classes.Any()) { element.Class(classes); } } element.RemoveAttribute(classAttributeName); } } //处理CSS样式 var styleAttributes = element.Attributes().Where(a => a.Name.StartsWith(styleAttributePrefix)).ToArray(); if (styleAttributes.Any()) { BindElementStyles(element, styleAttributes); } if (!element.Name.EqualsIgnoreCase("view") && !element.Name.EqualsIgnoreCase("binding")) { var dataContextExpression = AttributeExpression.ParseExpression(element.Attribute("datacontext")); if (dataContextExpression != null) { dataContext = GetDataObject(dataContextExpression, context); } return(false); } var expression = new AttributeExpression(element); object dataObject = GetDataObject(expression, context); if (dataObject == null) { return(false); } var format = element.Attribute("format").Value(); //绑定到客户端脚本对象 var variableName = element.Attribute("var").Value() ?? element.Attribute("variable").Value(); if (variableName != null) { if (format != null) { dataObject = string.Format(format, dataObject); } var hostName = element.Attribute("host").Value(); var script = (string)null; if (hostName == null) { script = string.Format("(function(){{ this['{0}'] = {1} }})();", variableName, ToJson(dataObject)); } else { script = string.Format("(function(){{ this['{0}'] = {1} }})();", variableName, ToJson(dataObject)); } element.ReplaceWith(string.Format("<script type=\"text/javascript\">{0}</script>", script)); return(true); } //绑定为 HTML 文本 var bindValue = string.Format(format ?? "{0}", dataObject); var attributeName = element.Attribute("attribute").Value() ?? element.Attribute("attr").Value(); if (attributeName != null) { var nextElement = element.NextElement(); if (nextElement == null) { return(false); } nextElement.SetAttribute(attributeName, bindValue); return(true); } element.ReplaceWith(bindValue); return(true); }