/// <summary> /// 获取绑定值 /// </summary> /// <param name="context">绑定上下文</param> /// <param name="arguments">绑定参数</param> /// <returns>绑定值</returns> public static string GetValue( HtmlBindingContext context, BindingExpression expression ) { var dataObject = GetDataObject( context, expression ); if ( dataObject == null ) return null; { string format; if ( expression.TryGetValue( context, "format", out format ) ) { if ( format.Contains( "{0" ) ) return string.Format( CultureInfo.InvariantCulture, format, dataObject ); else { var formattable = dataObject as IFormattable; if ( formattable != null ) return formattable.ToString( format, CultureInfo.InvariantCulture ); else return dataObject.ToString(); } } } return dataObject.ToString(); }
object IExpressionBinder.GetValue( HtmlBindingContext context, BindingExpression expression ) { var dataModel = GetDataObject( context, expression ); if ( dataModel == null ) return null; CssElementSelector elementSelector = null; string selector; if ( expression.TryGetValue( context, "selector", out selector ) ) elementSelector = CssParser.ParseElementSelector( selector ); ListBindingMode mode; string modeSetting; if ( expression.TryGetValue( context, "mode", out modeSetting ) && modeSetting.EqualsIgnoreCase( "static" ) ) mode = ListBindingMode.StaticContent; else mode = ListBindingMode.DynamicContent; return new ListDataModel( (IEnumerable) dataModel, elementSelector, mode ); }
/// <summary> /// 绑定元素 /// </summary> /// <param name="context">当前绑定上下文</param> /// <param name="element">要绑定的元素</param> /// <returns>永远返回 false,表示继续进行后面的绑定</returns> public void BindElement( HtmlBindingContext context, IHtmlElement element ) { if ( !element.Document.HtmlSpecification.IsCDataElement( element.Name ) ) return; if ( element.Attribute( "literal-binder" ) == null ) return; lock ( element.SyncRoot ) { var text = element.InnerHtml(); text = LiteralBind( text ); } }
/// <summary> /// 对元素进行数据绑定 /// </summary> /// <param name="element">需要绑定数据的元素</param> /// <param name="context">绑定上下文</param> /// <returns>返回是否对元素进行了不可逆转的操作(例如移除),故而禁止后续的绑定操作</returns> public void BindElement( HtmlBindingContext context, IHtmlElement element ) { 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(); context.CancelChildsBinding = context.BindCompleted = true; } } { //处理样式类 var classAttribute = element.Attribute( classAttributePrefix ); 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( classAttributePrefix ); } } { var classAttributes = element.Attributes().Where( a => a.Name.StartsWith( classAttributePrefix ) ).ToArray(); BindElementClasses( element, classAttributes ); } //处理CSS样式 var styleAttributes = element.Attributes().Where( a => a.Name.StartsWith( styleAttributePrefix ) ).ToArray(); BindElementStyles( element, styleAttributes ); }
/// <summary> /// 对 HTML 中的 script 元素进行绑定 /// </summary> /// <param name="context">当前绑定上下文</param> /// <param name="element">当前绑定的元素(仅会对 script 元素起作用)</param> /// <returns>永远返回 false,表示其他绑定器可以继续执行</returns> public void BindElement( HtmlBindingContext context, IHtmlElement element ) { if ( !element.Name.EqualsIgnoreCase( "script" ) ) return; var script = element.InnerHtml(); script = scriptBindingExpression.Replace( script, match => { var expression = BindingExpression.ParseExpression( match.Groups["expression"].Value ); if ( expression == null ) return match.Value; object dataObject = context.GetValue( expression ); var valueExpression = serializer.Serialize( dataObject ); return match.Groups["declare"].Value + valueExpression + ";"; } ); element.InnerHtml( script ); }
/// <summary> /// 根据绑定参数获取数据对象 /// </summary> /// <param name="context">绑定上下文</param> /// <param name="arguments">绑定参数</param> /// <returns>数据对象</returns> public static object GetDataObject( HtmlBindingContext context, BindingExpression expression ) { object dataObject = context.DataModel; if ( dataObject != null ) { string path; if ( expression.TryGetValue( context, "path", out path ) ) { if ( dataObject == null ) return null; dataObject = DataBinder.Eval( dataObject, path ); } } object value; if ( expression.TryGetValue( context, "value", out value ) ) { if ( dataObject != null && Convert.ToBoolean( dataObject ) == true ) return value; else if ( expression.TryGetValue( context, "alternativeValue", out value ) ) return value; else return null; } return dataObject; }
internal HtmlListBindingContext( HtmlBindingContext context, IHtmlElement element, ListDataModel dataModel ) : base( context, element, dataModel ) { DataModel = dataModel; BindingElement = element; }
object IExpressionBinder.GetValue( HtmlBindingContext context, BindingExpression expression ) { return GetValue( context, expression ); }
public HtmlBindingContext CreateBindingContext( HtmlBindingContext bindingContext, IHtmlContainer scope, object datamodel ) { return new HtmlListBindingContext( bindingContext, (IHtmlElement) scope, (ListDataModel) datamodel ); }