コード例 #1
0
            public HtmlInputItem(HtmlButtonGroup group, IHtmlElement element)
            {
                _group = group;

                if (!element.Name.EqualsIgnoreCase("input"))
                {
                    throw new InvalidOperationException();
                }

                var type = element.Attribute("type").Value();

                if (type.EqualsIgnoreCase("radio"))
                {
                    radio = true;
                }

                else if (type.EqualsIgnoreCase("checkbox"))
                {
                    radio = false;
                }

                else
                {
                    throw new InvalidOperationException();
                }

                if (string.IsNullOrEmpty(element.Attribute("name").Value()))
                {
                    throw new InvalidOperationException();
                }

                _element = element;
            }
コード例 #2
0
        /// <summary>
        /// 渲染部分视图(重写此方法以实现自定义输出 partial 元素)
        /// </summary>
        /// <param name="partialElement">partial 元素</param>
        /// <returns></returns>
        protected virtual string RenderPartial(IHtmlElement partialElement)
        {
            var path = partialElement.Attribute("path").Value();
            var name = partialElement.Attribute("name").Value();

            try
            {
                if (!PartialExecutors.IsNullOrEmpty() && name != null)
                {
                    return(RenderNamedPartial(partialElement, name));
                }


                else if (path != null)
                {
                    return(RenderVirtualPath(path));
                }
            }
            catch //若渲染时发生错误
            {
                if (JumonyWebConfiguration.Configuration.IgnorePartialRenderException || partialElement.Attribute("ignoreError") != null)
                {
                    return("<!--parital render failed-->");
                }
                else
                {
                    throw;
                }
            }

            throw new NotSupportedException("无法处理的partial标签:" + ContentExtensions.GenerateTagHtml(partialElement, false));
        }
コード例 #3
0
ファイル: JumonyUrlHelper.cs プロジェクト: toddfsy/Jumony
        /// <summary>
        /// 从元素标签中获取路由的虚拟路径
        /// </summary>
        /// <param name="element">要获取分析路由虚拟路径的元素</param>
        /// <param name="clearRouteAttributes">是否清理路由属性设置</param>
        /// <returns>获取的虚拟路径</returns>
        internal string GetRouteUrl(IHtmlElement element, bool clearRouteAttributes)
        {
            if (element == null)
            {
                throw new ArgumentNullException("element");
            }

            if (element.Attribute("action") == null)
            {
                throw new InvalidOperationException();
            }

            var action     = element.Attribute("action").Value() ?? RouteData.Values["action"].CastTo <string>();
            var controller = element.Attribute("controller").Value() ?? RouteData.Values["controller"].CastTo <string>();


            var routeValues = GetRouteValues(element, clearRouteAttributes);


            if (clearRouteAttributes)
            {
                element.RemoveAttribute("action");
                element.RemoveAttribute("controller");
                element.RemoveAttribute("inherits");
            }

            return(Url.Action(action, controller, routeValues));
        }
コード例 #4
0
ファイル: FormButtonGroupItem.cs プロジェクト: ajayumi/Jumony
    internal FormButtonGroupItem( FormButtonGroup groupControl, IHtmlElement element )
      : base( groupControl )
    {

      if ( groupControl == null )
        throw new ArgumentNullException( "groupControl" );

      if ( element == null )
        throw new ArgumentNullException( "element" );

      if ( !element.Name.EqualsIgnoreCase( "input" ) )
        throw new InvalidOperationException();

      if ( !element.Attribute( "name" ).Value().EqualsIgnoreCase( groupControl.Name ) )
        throw new InvalidOperationException();

      var type = element.Attribute( "type" ).Value();

      if ( type.EqualsIgnoreCase( "radio" ) )
        ButtonType = FormGroupButtonType.RadioButton;

      else if ( type.EqualsIgnoreCase( "checkbox" ) )
        ButtonType = FormGroupButtonType.RadioButton;

      else
        throw new InvalidOperationException();

      Element = element;
    }
コード例 #5
0
ファイル: ActionUrlBinder.cs プロジェクト: zpzgone/Jumony
        /// <summary>
        /// 派生类重写此方法对拥有 Action URL 的元素进行处理
        /// </summary>
        /// <param name="element">要处理的元素</param>
        /// <returns>元素是否包含 Action URL 并已经进行处理。</returns>
        protected virtual bool ProcessActionLink(IHtmlElement element)
        {
            if (element.Attribute("action") == null)
            {
                return(false);
            }

            string attributeName;

            if (element.Name.EqualsIgnoreCase("a"))
            {
                attributeName = "href";
            }

            else if (element.Name.EqualsIgnoreCase("img") || element.Name.EqualsIgnoreCase("script"))
            {
                attributeName = "src";
            }

            else if (element.Name.EqualsIgnoreCase("form") && element.Attribute("controller") != null)
            {
                attributeName = "action";
            }

            else
            {
                return(false);
            }



            var action     = element.Attribute("action").Value() ?? RouteData.Values["action"].CastTo <string>();
            var controller = element.Attribute("controller").Value() ?? RouteData.Values["controller"].CastTo <string>();


            var routeValues = UrlHelper.GetRouteValues(element);


            element.RemoveAttribute("action");
            element.RemoveAttribute("controller");
            element.RemoveAttribute("inherits");


            var url = UrlHelper.Action(action, controller, routeValues);

            if (url == null)
            {
                element.Attribute(attributeName).Remove();
            }

            else
            {
                element.SetAttribute(attributeName, url);
            }


            return(true);
        }
コード例 #6
0
 /// <summary>
 /// 设置属性
 /// </summary>
 /// <param name="input"></param>
 /// <param name="disabled"></param>
 protected void SetAttributeDisabledReadOnly(IHtmlElement input, bool disabled)
 {
     if (disabled)
     {
         input.Attribute(HtmlAttribute.Disabled, "disabled");
     }
     if (PropertyContent.ReadOnly)
     {
         input.Attribute(HtmlAttribute.ReadOnly, "readonly");
     }
 }
コード例 #7
0
 /// <summary>
 /// 设置属性
 /// </summary>
 /// <param name="input"></param>
 /// <param name="disabled"></param>
 protected void SetAttributeDisabledReadOnlyPlaceHolder(IHtmlElement input, bool disabled)
 {
     if (disabled)
     {
         input.Attribute(HtmlAttribute.Disabled, "disabled");
     }
     if (PropertyContent.ReadOnly)
     {
         input.Attribute(HtmlAttribute.ReadOnly, "readonly");
     }
     if (!string.IsNullOrEmpty(PropertyContent.Description))
     {
         input.Attribute(HtmlAttribute.PlaceHolder, PropertyContent.Description);
     }
 }
コード例 #8
0
        private HashSet <string> GetClasses()
        {
            var classSet = new HashSet <string>();


            var classes = _element.Attribute("class").Value();

            if (classes == null)
            {
                return(classSet);
            }

            foreach (var c in classes.Split(' '))
            {
                if (string.IsNullOrEmpty(c))
                {
                    continue;
                }

                if (classSet.Contains(c))
                {
                    continue;
                }


                classSet.Add(c);
            }

            return(classSet);
        }
コード例 #9
0
        /// <summary>
        /// 返回元素的唯一ID,没有ID属性,或者有但非唯一,返回null
        /// </summary>
        /// <param name="element">要标识的元素</param>
        /// <param name="create">指示当没有唯一ID时是否创建一个</param>
        /// <param name="ancestorsCreate">在创建ID的过程中,是否为没有唯一ID的父级也创建ID</param>
        /// <returns>元素的唯一ID。</returns>
        public static string Identity(this IHtmlElement element, bool create, bool ancestorsCreate)
        {
            if (element == null)
            {
                throw new ArgumentNullException("element");
            }


            EnsureAllocated(element);

            var id = element.Attribute("id").Value();

            if (string.IsNullOrEmpty(id) || !element.Document.AllElements().Where(e => e.Attribute("id").Value() == id).IsSingle())
            {
                id = null;
            }

            if (create && id == null)
            {
                element.SetAttribute("id", id = CreateIdentity(element, ancestorsCreate));
            }


            return(id);
        }
コード例 #10
0
ファイル: ViewBase.cs プロジェクト: wangscript007/roycms
        /// <summary>
        /// 从元素标签中获取所有的路由值
        /// </summary>
        /// <param name="element">要获取分析路由值的元素</param>
        /// <returns>获取的路由值</returns>
        protected RouteValueDictionary GetRouteValues(IHtmlElement element)
        {
            var routeValues = new RouteValueDictionary();

            var inherits = element.Attribute("inherits").Value();

            if (inherits != null)
            {
                var inheritsKeys = GetInheritsKeys(inherits).Distinct(StringComparer.OrdinalIgnoreCase);

                foreach (var key in inheritsKeys)
                {
                    routeValues.Add(key, RouteData.Values[key]);
                }
            }


            foreach (var attribute in element.Attributes().Where(a => a.Name.StartsWith("_")).ToArray())
            {
                var key   = attribute.Name.Substring(1);
                var value = attribute.Value() ?? RouteData.Values[key];

                routeValues.Remove(key);

                routeValues.Add(key, value);
                attribute.Remove();
            }

            return(routeValues);
        }
コード例 #11
0
 public void GetPageUrlToRedis(string url)
 {
     try
     {
         IHtmlDocument html       = new JumonyParser().LoadDocument(url);
         var           pagelist   = html.Find(".co_content8 .x a");
         var           last_index = pagelist.Count() - 3;
         var           end_index  = pagelist.Count() - 1;
         var           last_url   = pagelist.ToList()[last_index].Attribute("href").Value();
         var           end_txt    = pagelist.ToList()[end_index].InnerText();
         this.isendpage = end_txt.IndexOf("末页") >= 0 ? false : true;
         looplast_index = isendpage ? pagelist.Count() : pagelist.Count() - 1;
         var last_full_url = page_baseurl + last_url;
         int i             = 0;
         i = isfirstpage ? 0 : 2;
         for (; i < looplast_index; i++)
         {
             IHtmlElement item        = pagelist.ToList()[i];
             string       pageurl     = item.Attribute("href").Value();
             string       pagefullurl = page_baseurl + pageurl;
             db.SortedSetAdd("filmpageurl", pagefullurl, (double)index++);
             if (i == last_index && !isendpage)
             {
                 isfirstpage = false;
                 GetPageUrl(pagefullurl);
             }
         }
     }
     catch (Exception e)
     {
         log.Error(e.Message);
         throw;
     }
 }
コード例 #12
0
        private void GetUrlText_1(Class1[] RTc, IHtmlDocument document)
        {
            IEnumerable <IHtmlElement>  result = document.Find("div").Where(d => d.Identity() == "main");
            IEnumerable <IHtmlElement>  t      = result.Find("tr");
            Dictionary <string, string> dir    = new Dictionary <string, string>();
            int r = 0;

            foreach (var item in t)
            {
                #region MyRegion
                Class1       _class = new Class1();
                IHtmlElement item_a = item.FindFirst(".bthead>a");
                _class.TextName = item_a.InnerText().Trim();
                _class.href     = item_a.Attribute("href").Value().Trim();
                _class.Quyu     = GetN_value(item, ".a_xq1");
                string st = GetN_value(item, ".qj-lijjrname");
                _class.PersonName = st.Replace(":", "").Trim();;
                _class.Laiyuan    = GetN_value(item, "label");
                string[]      str_  = GetN_value(item, ".qj-listleft").Split(' ');
                List <string> str_1 = LIST_G(str_);
                _class.Address = str_1[2];
                //_class.SumMoney = item.FindFirst(".pri").InnerText();
                string[] ssp = GetN_value(item, ".qj-listright").Split(' ');
                int      j   = ssp.Length == 10 ? 0 : 10 - ssp.Length;
                _class.SumMoney  = ssp[1 - j] + ssp[2 - j];
                _class.PingMoney = ssp[4 - j];
                _class.Allpm     = ssp[7 - j] + ssp[9 - j];
                string[] datetime = GetN_value(item, ".qj-listjjr").Split(' ');
                _class.datetime = datetime.Length == 3 ? datetime[2] : "";
                RTc[r]          = _class;
                r++;
                #endregion
            }
        }
コード例 #13
0
ファイル: AttributeExtensions.cs プロジェクト: zpzgone/Jumony
        /// <summary>
        /// 设置属性值
        /// </summary>
        /// <param name="element">要设置属性值的元素</param>
        /// <param name="attributeName">属性名</param>
        /// <param name="value">属性值</param>
        /// <param name="attribute">设置好的属性</param>
        /// <returns>设置了属性的元素</returns>
        public static IHtmlElement SetAttribute(this IHtmlElement element, string attributeName, string value, out IHtmlAttribute attribute)
        {
            if (element == null)
            {
                throw new ArgumentNullException("element");
            }

            if (attributeName == null)
            {
                throw new ArgumentNullException("attributeName");
            }

            lock (element.SyncRoot)
            {
                var _attribute = element.Attribute(attributeName);

                if (_attribute != null)
                {
                    _attribute.Remove();
                }

                attribute = element.AddAttribute(attributeName, value);
            }

            return(element);
        }
コード例 #14
0
ファイル: JumonyUrlHelper.cs プロジェクト: ajayumi/Jumony
    internal RouteValueDictionary GetRouteValues( IHtmlElement element, bool clearRouteAttributes )
    {

      var routeValues = new RouteValueDictionary();

      var inherits = element.Attribute( "inherits" ).Value();

      if ( inherits != null )
      {

        var inheritsKeys = GetInheritsKeys( inherits );

        foreach ( var key in inheritsKeys )
          routeValues.Add( key, RequestContext.RouteData.Values[key] );

      }


      if ( !MvcEnvironment.Configuration.DisableUnderscorePrefix )
        CustomRouteValues( element, "_", routeValues, clearRouteAttributes );
      
      CustomRouteValues( element, "route-", routeValues, clearRouteAttributes );

      return routeValues;
    }
コード例 #15
0
ファイル: JumonyUrlHelper.cs プロジェクト: zpzgone/Jumony
        internal RouteValueDictionary GetRouteValues(IHtmlElement element, bool clearRouteAttributes)
        {
            var routeValues = new RouteValueDictionary();

            var inherits = element.Attribute("inherits").Value();

            if (inherits != null)
            {
                var inheritsKeys = GetInheritsKeys(inherits);

                foreach (var key in inheritsKeys)
                {
                    routeValues.Add(key, RequestContext.RouteData.Values[key]);
                }
            }


            if (!MvcEnvironment.Configuration.DisableUnderscorePrefix)
            {
                CustomRouteValues(element, "_", routeValues, clearRouteAttributes);
            }

            CustomRouteValues(element, "route-", routeValues, clearRouteAttributes);

            return(routeValues);
        }
コード例 #16
0
        public HtmlTextInput(IHtmlElement element)
        {
            if (string.Equals(element.Name, "input", StringComparison.InvariantCultureIgnoreCase))
            {
                var inputTypes = new[] { "text", "password", "hidden" };

                if (!inputTypes.Contains(element.Attribute("type").Value, StringComparer.InvariantCultureIgnoreCase))
                {
                    throw new InvalidOperationException("只有type为text、password或hidden的input元素才能转换为HtmlTextInput对象");
                }

                _element            = element;
                _valueAttributeName = "value";
            }
            else if (string.Equals(element.Name, "textarea", StringComparison.InvariantCultureIgnoreCase))
            {
                _element            = element;
                _valueAttributeName = ":text";
            }

            if (_element == null)
            {
                throw new InvalidOperationException("只有input或textarea元素才能转换为HtmlTextInput对象");
            }
        }
コード例 #17
0
ファイル: StyleBinder.cs プロジェクト: ajayumi/Jumony
    /// <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 );
    }
コード例 #18
0
ファイル: StyleBinder.cs プロジェクト: zpzgone/Jumony
        /// <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);
        }
コード例 #19
0
ファイル: _Extends.cs プロジェクト: Oldmansoft/WebMan
        /// <summary>
        /// 设置目标属性
        /// </summary>
        /// <param name="source"></param>
        /// <param name="element"></param>
        internal static void SetTargetAttribute(this LinkBehave source, IHtmlElement element)
        {
            var target = source.GetTarget();

            if (target == null)
            {
                return;
            }
            element.Attribute(HtmlAttribute.Target, target);
        }
コード例 #20
0
ファイル: FormButtonGroupItem.cs プロジェクト: zpzgone/Jumony
        internal FormButtonGroupItem(FormButtonGroup groupControl, IHtmlElement element)
            : base(groupControl)
        {
            if (groupControl == null)
            {
                throw new ArgumentNullException("groupControl");
            }

            if (element == null)
            {
                throw new ArgumentNullException("element");
            }

            if (!element.Name.EqualsIgnoreCase("input"))
            {
                throw new InvalidOperationException();
            }

            if (!element.Attribute("name").Value().EqualsIgnoreCase(groupControl.Name))
            {
                throw new InvalidOperationException();
            }

            var type = element.Attribute("type").Value();

            if (type.EqualsIgnoreCase("radio"))
            {
                ButtonType = FormGroupButtonType.RadioButton;
            }

            else if (type.EqualsIgnoreCase("checkbox"))
            {
                ButtonType = FormGroupButtonType.RadioButton;
            }

            else
            {
                throw new InvalidOperationException();
            }

            Element = element;
        }
コード例 #21
0
ファイル: HtmlInputText.cs プロジェクト: neo2018/Jumony
        internal HtmlInputText( HtmlForm form, IHtmlElement element )
        {
            if ( !element.Name.EqualsIgnoreCase( "input" ) )
            throw new InvalidOperationException( "只有input元素才能转换为HtmlTextInput对象" );

              _type = element.Attribute( "type" ).Value();
              if ( !allowTypes.Contains( _type, StringComparer.OrdinalIgnoreCase ) )
            throw new InvalidOperationException( "只有type为text、password或hidden的input元素才能转换为HtmlTextInput对象" );

              _form = form;
              _element = element;
        }
コード例 #22
0
        /// <summary>
        /// 确保当前跟踪的样式是最新的
        /// </summary>
        private void EnsureStyle()
        {
            lock (_element.SyncRoot)
            {
                var styleAttribute = _element.Attribute("style");

                if (_style == null || styleAttribute != _attribute || (styleAttribute == null && _style.Any()))
                {
                    _style     = CssPropertyParser.ParseCssStyle(styleAttribute.Value().IfNull(""));
                    _attribute = styleAttribute;
                }
            }
        }
コード例 #23
0
        /// <summary>
        /// 检查元素是否符合选择条件
        /// </summary>
        /// <param name="element">要检查的元素</param>
        /// <returns>是否符合条件</returns>
        public bool IsEligible( IHtmlElement element )
        {
            string _value = null;

              var attribute = element.Attribute( name );

              if ( comparison == null )//如果没有运算符,那么表示判断属性是否存在
            return attribute != null;

              if ( attribute != null )
            _value = attribute.AttributeValue;

              return matchers[comparison]( value, _value );
        }
コード例 #24
0
        internal CssStyle(IHtmlElement element)
        {
            if (element == null)
            {
                throw new ArgumentNullException("element");
            }

            _element = element;

            lock (element.SyncRoot)
            {
                settings = GetStyleSettings(element.Attribute("style").Value());
            }
        }
コード例 #25
0
ファイル: ViewBase.cs プロジェクト: wangscript007/roycms
        /// <summary>
        /// 渲染部分视图
        /// </summary>
        /// <param name="partialElement">partial 元素</param>
        /// <returns></returns>
        protected virtual string RenderPartial(IHtmlElement partialElement)
        {
            var action  = partialElement.Attribute("action").Value();
            var view    = partialElement.Attribute("view").Value();
            var path    = partialElement.Attribute("path").Value();
            var handler = partialElement.Attribute("handler").Value();


            var helper = MakeHelper();


            try
            {
                if (action != null)//Action 部分视图
                {
                    var controller  = partialElement.Attribute("controller").Value() ?? (string)RouteData.Values["controller"];
                    var routeValues = GetRouteValues(partialElement);

                    return(helper.Action(actionName: action, controllerName: controller, routeValues: routeValues).ToString());
                }

                else if (view != null)
                {
                    return(helper.Partial(partialViewName: view).ToString());
                }

                else if (path != null)
                {
                    if (!VirtualPathUtility.IsAppRelative(path))
                    {
                        throw new FormatException("path 只能使用应用程序根相对路径,即以 \"~/\" 开头的路径,调用 VirtualPathUtility.ToAppRelative 方法或使用 HttpRequest.AppRelativeCurrentExecutionFilePath 属性获取");
                    }

                    var content = HtmlProviders.LoadContent(HttpContext, path);
                    if (content != null)
                    {
                        return(content.Content);
                    }
                }
            }
            catch (ThreadAbortException)
            {
            }
            catch //若渲染时发生错误
            {
                if (MvcEnvironment.Configuration.IgnorePartialRenderException || partialElement.Attribute("ignoreError") != null)
                {
                    return("<!--parital view render failed-->");
                }
                else
                {
                    throw;
                }
            }

            throw new NotSupportedException("无法处理的partial标签:" + ContentExtensions.GenerateTagHtml(partialElement, false));
        }
コード例 #26
0
ファイル: PartialViewExecutor.cs プロジェクト: neo2018/Jumony
        public string Execute( object handler, IHtmlElement partialElement )
        {
            object[] parameterValues = new object[_parameters.Length];

              foreach ( var parameter in _parameters )
              {
            var value = partialElement.Attribute( parameter.Name ).Value();
            if ( value != null )
              parameterValues[parameter.Position] = ConvertValue( value, parameter.ParameterType );
            else
              parameterValues[parameter.Position] = parameter.DefaultValue.IfNull( null );
              }

              return _executor( handler, parameterValues );
        }
コード例 #27
0
ファイル: PartialViewAdapter.cs プロジェクト: zpzgone/Jumony
        /// <summary>
        /// 渲染部分视图(重写此方法以实现自定义输出 partial 元素)
        /// </summary>
        /// <param name="partialElement">partial 元素</param>
        /// <returns></returns>
        protected override string RenderPartial(IHtmlElement partialElement)
        {
            var action = partialElement.Attribute("action").Value();
            var view   = partialElement.Attribute("view").Value();
            var path   = partialElement.Attribute("path").Value();
            var name   = partialElement.Attribute("name").Value();

            if (name != null)
            {
                return(RenderNamedPartial(partialElement, name));
            }

            var helper = MakeHelper();


            try
            {
                if (action != null)//Action 部分视图
                {
                    var routeValues = Url.GetRouteValues(partialElement);

                    return(RenderAction(partialElement, action, partialElement.Attribute("controller").Value(), routeValues));
                }

                else if (view != null)
                {
                    return(RenderPartial(partialElement, view));
                }

                else if (path != null)
                {
                    RenderVirtualPath(path);
                }
            }

            catch (ThreadAbortException)
            {
                throw;//不应屏蔽异常
            }

            catch //若渲染时发生错误
            {
                if (MvcEnvironment.Configuration.IgnorePartialRenderException || partialElement.Attribute("ignoreError") != null)
                {
                    return("<!--parital view render failed-->");
                }
                else
                {
                    throw;
                }
            }

            throw new NotSupportedException("无法处理的partial标签:" + ContentExtensions.GenerateTagHtml(partialElement, false));
        }
コード例 #28
0
ファイル: LiteralBinder.cs プロジェクト: ajayumi/Jumony
    /// <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 );
      }
    }
コード例 #29
0
ファイル: HtmlInputText.cs プロジェクト: wangscript007/roycms
        internal HtmlInputText(HtmlForm form, IHtmlElement element)
        {
            if (!element.Name.EqualsIgnoreCase("input"))
            {
                throw new InvalidOperationException("只有input元素才能转换为HtmlTextInput对象");
            }


            _type = element.Attribute("type").Value();
            if (!allowTypes.Contains(_type, StringComparer.OrdinalIgnoreCase))
            {
                throw new InvalidOperationException("只有type为text、password或hidden的input元素才能转换为HtmlTextInput对象");
            }

            _form    = form;
            _element = element;
        }
コード例 #30
0
ファイル: StyleClassManager.cs プロジェクト: zpzgone/Jumony
        /// <summary>
        /// 确保跟踪到了最新的样式类信息。
        /// </summary>
        private void EnsureUpdated()
        {
            var classValue = _element.Attribute("class").Value();

            if (_rawValue != classValue || _classes == null)
            {
                if (string.IsNullOrEmpty(classValue))
                {
                    _classes = new HashSet <string>();
                }
                else
                {
                    _classes = new HashSet <string>(Regulars.whiteSpaceSeparatorRegex.Split(classValue).Where(c => c != ""));
                }
                _rawValue = classValue;
            }
        }
コード例 #31
0
        /// <summary>
        /// 检查元素是否符合选择条件
        /// </summary>
        /// <param name="element">要检查的元素</param>
        /// <returns>是否符合条件</returns>
        public bool IsEligible(IHtmlElement element)
        {
            string _value = null;

            var attribute = element.Attribute(name);

            if (comparison == null)//如果没有运算符,那么表示判断属性是否存在
            {
                return(attribute != null);
            }

            if (attribute != null)
            {
                _value = attribute.AttributeValue;
            }

            return(matchers[comparison](value, _value));
        }
コード例 #32
0
        protected override void OnAddElement(IHtmlElement element)
        {
            var id = element.Attribute("id").Value();

            if (id == null)
            {
                return;
            }


            if (data.ContainsKey(id))
            {
                throw new InvalidOperationException(string.Format("文档结构不正确,存在两个 id 为 \"{0}\" 的元素,索引编制失败", id));
            }


            data.Add(id, element);
        }
コード例 #33
0
        private void GetUrlText_2(IHtmlDocument document, List <Class1> L_Class)
        {
            IEnumerable <IHtmlElement> result1 = document.Find(".list-items");

            foreach (var item in result1)
            {
                #region MyRegion
                Class1       _class  = new Class1();
                IHtmlElement item_a  = item.FindFirst("a");
                string       img_str = item.Exists("img") ? item.FindFirst("img").Attribute("src").Value() : "";
                _class.Image_Count = img_str.Length > 0 ? img_str.IndexOf("default.jpg") > 0?0:1:0;
                IEnumerable <IHtmlElement> div = item.Find("div");
                List <string> ls = new List <string>();
                foreach (var d in div)
                {
                    ls.Add(d.InnerText());
                }
                _class.TextName = ls[2];
                _class.SumMoney = ls[4];
                _class.Quyu     = "赶集";
                _class.Allpm    = ls[1];
                _class.Address  = ls[0];
                _class.href     = item_a.Attribute("href").Value().Trim();

                IEnumerable <IHtmlElement> ssa = item_a.Find("span");

                string item_aa = item_a.ToString().Replace("<!--", "stu1").Replace("-->", "stp2");
                item_aa         = item_aa.Substring(item_aa.IndexOf("stu1") + 4);
                item_aa         = item_aa.Substring(0, item_aa.IndexOf("stp2"));
                item_aa         = item_aa.Substring(item_aa.IndexOf(">") + 1);
                item_aa         = item_aa.Substring(0, item_aa.IndexOf("<"));
                _class.datetime = item_aa;
                string[] pm = _class.Allpm.Split(' ');

                double pm_int = Convert.ToDouble(pm[6].Replace('㎡', ' ').Trim().Length <= 0 ? pm[5].Replace('㎡', ' ').Trim() : pm[6].Replace('㎡', ' ').Trim());
                double ss     = ((Convert.ToDouble(_class.SumMoney.Replace("万元", "").Trim()) / pm_int));
                _class.PingMoney = "≈" + Convert.ToInt32(ss * 10000).ToString();
                _class.Image_str = _class.Image_Count > 0 ? "有" : string.Empty;

                L_Class.Add(_class);
                r++;
                #endregion
            }
        }
コード例 #34
0
ファイル: LiteralBinder.cs プロジェクト: zpzgone/Jumony
        /// <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);
            }
        }
コード例 #35
0
ファイル: PartialExecutor.cs プロジェクト: zpzgone/Jumony
        /// <summary>
        /// 执行分部页获取渲染结果
        /// </summary>
        /// <param name="host">分部视图执行方法所属的对象</param>
        /// <param name="partialElement">定义分部页的元素</param>
        /// <returns></returns>
        public string Execute(object host, IHtmlElement partialElement)
        {
            object[] parameterValues = new object[_parameters.Length];

            foreach (var parameter in _parameters)
            {
                var value = partialElement.Attribute(parameter.Name).Value();
                if (value != null)
                {
                    parameterValues[parameter.Position] = ConvertValue(value, parameter.ParameterType);
                }
                else
                {
                    parameterValues[parameter.Position] = parameter.DefaultValue.IfNull(null);
                }
            }

            return(_executor(host, parameterValues));
        }
コード例 #36
0
ファイル: HtmlTextInput.cs プロジェクト: neo2018/Jumony
        public HtmlTextInput( IHtmlElement element )
        {
            if ( string.Equals( element.Name, "input", StringComparison.InvariantCultureIgnoreCase ) )
              {
            var inputTypes = new[] { "text", "password", "hidden" };

            if ( !inputTypes.Contains( element.Attribute( "type" ).Value, StringComparer.InvariantCultureIgnoreCase ) )
              throw new InvalidOperationException( "只有type为text、password或hidden的input元素才能转换为HtmlTextInput对象" );

            _element = element;
            _valueAttributeName = "value";
              }
              else if ( string.Equals( element.Name, "textarea", StringComparison.InvariantCultureIgnoreCase ) )
              {
            _element = element;
            _valueAttributeName = ":text";
              }

              if ( _element == null )
            throw new InvalidOperationException( "只有input或textarea元素才能转换为HtmlTextInput对象" );
        }
コード例 #37
0
ファイル: HtmlInputText.cs プロジェクト: ajayumi/Jumony
 internal HtmlInputText( HtmlForm form, IHtmlElement element )
   : base( form, element )
 {
   var value = element.Attribute( "value" ).Value() ?? "";
 }
コード例 #38
0
ファイル: ActionUrlBinder.cs プロジェクト: ajayumi/Jumony
    /// <summary>
    /// 派生类重写此方法对拥有 Action URL 的元素进行处理
    /// </summary>
    /// <param name="element">要处理的元素</param>
    /// <returns>元素是否包含 Action URL 并已经进行处理。</returns>
    protected virtual bool ProcessActionLink( IHtmlElement element )
    {
      if ( element.Attribute( "action" ) == null )
        return false;

      string attributeName;

      if ( element.Name.EqualsIgnoreCase( "a" ) )
        attributeName = "href";

      else if ( element.Name.EqualsIgnoreCase( "img" ) || element.Name.EqualsIgnoreCase( "script" ) )
        attributeName = "src";

      else if ( element.Name.EqualsIgnoreCase( "form" ) && element.Attribute( "controller" ) != null )
        attributeName = "action";

      else
        return false;



      var action = element.Attribute( "action" ).Value() ?? RouteData.Values["action"].CastTo<string>();
      var controller = element.Attribute( "controller" ).Value() ?? RouteData.Values["controller"].CastTo<string>();


      var routeValues = UrlHelper.GetRouteValues( element );


      element.RemoveAttribute( "action" );
      element.RemoveAttribute( "controller" );
      element.RemoveAttribute( "inherits" );


      var url = UrlHelper.Action( action, controller, routeValues );

      if ( url == null )
        element.Attribute( attributeName ).Remove();

      else
        element.SetAttribute( attributeName, url );


      return true;
    }
コード例 #39
0
ファイル: PartialViewAdapter.cs プロジェクト: ajayumi/Jumony
    /// <summary>
    /// 渲染部分视图(重写此方法以实现自定义输出 partial 元素)
    /// </summary>
    /// <param name="partialElement">partial 元素</param>
    /// <returns></returns>
    protected override string RenderPartial( IHtmlElement partialElement )
    {
      var action = partialElement.Attribute( "action" ).Value();
      var view = partialElement.Attribute( "view" ).Value();
      var path = partialElement.Attribute( "path" ).Value();
      var name = partialElement.Attribute( "name" ).Value();

      if ( name != null )
        return RenderNamedPartial( partialElement, name );

      var helper = MakeHelper();


      try
      {
        if ( action != null )//Action 部分视图
        {
          var routeValues = Url.GetRouteValues( partialElement );

          return RenderAction( partialElement, action, partialElement.Attribute( "controller" ).Value(), routeValues );
        }

        else if ( view != null )
        {
          return RenderPartial( partialElement, view );
        }

        else if ( path != null )
        {
          RenderVirtualPath( path );
        }
      }

      catch ( ThreadAbortException )
      {
        throw;//不应屏蔽异常
      }

      catch //若渲染时发生错误
      {
        if ( MvcEnvironment.Configuration.IgnorePartialRenderException || partialElement.Attribute( "ignoreError" ) != null )
          return "<!--parital view render failed-->";
        else
          throw;
      }

      throw new NotSupportedException( "无法处理的partial标签:" + ContentExtensions.GenerateTagHtml( partialElement, false ) );

    }
コード例 #40
0
        private static string GetElementName( IHtmlElement element )
        {
            switch ( element.Name.ToLowerInvariant() )
              {

            case "html":
            //case "head":
            case "body":
              return null;

            case "a":
              if ( element.Attribute( "name" ) != null )
            return "link";
              else
            return "anchor";

            case "li":
              return "item";

            case "ul":
            case "ol":
              return "list";

            case "h1":
            case "h2":
            case "h3":
            case "h4":
            case "h5":
            case "h6":
              return "header";

            default:
              return element.Name;

              }
        }
コード例 #41
0
ファイル: PartialViewAdapter.cs プロジェクト: neo2018/Jumony
        /// <summary>
        /// 渲染部分视图(重写此方法以实现自定义输出 partial 元素)
        /// </summary>
        /// <param name="partialElement">partial 元素</param>
        /// <returns></returns>
        protected virtual string RenderPartial( IHtmlElement partialElement )
        {
            var action = partialElement.Attribute( "action" ).Value();
              var view = partialElement.Attribute( "view" ).Value();
              var path = partialElement.Attribute( "path" ).Value();
              var handler = partialElement.Attribute( "handler" ).Value();
              var name = partialElement.Attribute( "name" ).Value();

              if ( !_partialExecutors.IsNullOrEmpty() && name != null )
              {
            var executor = _partialExecutors.FirstOrDefault( e => e.Name.EqualsIgnoreCase( name ) );
            if ( executor != null )
            {
              var wrapper = ViewHandler as IHandlerWrapper;
              if ( wrapper != null )
            return executor.Execute( wrapper.Handler, partialElement );
              else
            return executor.Execute( ViewHandler, partialElement );
            }
              }

              var helper = MakeHelper();

              try
              {
            if ( action != null )//Action 部分视图
            {
              var routeValues = Url.GetRouteValues( partialElement );

              return RenderAction( partialElement, action, partialElement.Attribute( "controller" ).Value(), routeValues );
            }

            else if ( view != null )
            {
              return RenderPartial( partialElement, view );
            }

            else if ( path != null )
            {
              if ( !VirtualPathUtility.IsAppRelative( path ) )
            throw new FormatException( "path 只能使用应用程序根相对路径,即以 \"~/\" 开头的路径,调用 VirtualPathUtility.ToAppRelative 方法或使用 HttpRequest.AppRelativeCurrentExecutionFilePath 属性获取" );

              var content = HtmlProviders.LoadContent( path );
              if ( content != null )
            return content.Content;
            }

              }
              catch ( ThreadAbortException )
              {

              }
              catch //若渲染时发生错误
              {
            if ( MvcEnvironment.Configuration.IgnorePartialRenderException || partialElement.Attribute( "ignoreError" ) != null )
              return "<!--parital view render failed-->";
            else
              throw;
              }

              throw new NotSupportedException( "无法处理的partial标签:" + ContentExtensions.GenerateTagHtml( partialElement, false ) );
        }
コード例 #42
0
ファイル: HtmlButtonGroup.cs プロジェクト: neo2018/Jumony
            public HtmlInputItem( HtmlButtonGroup group, IHtmlElement element )
            {
                _group = group;

                if ( !element.Name.EqualsIgnoreCase( "input" ) )
                  throw new InvalidOperationException();

                var type = element.Attribute( "type" ).Value();

                if ( type.EqualsIgnoreCase( "radio" ) )
                  radio = true;

                else if ( type.EqualsIgnoreCase( "checkbox" ) )
                  radio = false;

                else
                  throw new InvalidOperationException();

                if ( string.IsNullOrEmpty( element.Attribute( "name" ).Value() ) )
                  throw new InvalidOperationException();

                _element = element;
            }
コード例 #43
0
        /// <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;
        }
コード例 #44
0
    /// <summary>
    /// 渲染部分视图(重写此方法以实现自定义输出 partial 元素)
    /// </summary>
    /// <param name="partialElement">partial 元素</param>
    /// <returns></returns>
    protected virtual string RenderPartial( IHtmlElement partialElement )
    {
      var path = partialElement.Attribute( "path" ).Value();
      var name = partialElement.Attribute( "name" ).Value();

      try
      {

        if ( !PartialExecutors.IsNullOrEmpty() && name != null )
          return RenderNamedPartial( partialElement, name );


        else if ( path != null )
          return RenderVirtualPath( path );
      }
      catch //若渲染时发生错误
      {
        if ( JumonyWebConfiguration.Configuration.IgnorePartialRenderException || partialElement.Attribute( "ignoreError" ) != null )
          return "<!--parital render failed-->";
        else
          throw;
      }

      throw new NotSupportedException( "无法处理的partial标签:" + ContentExtensions.GenerateTagHtml( partialElement, false ) );

    }
コード例 #45
0
ファイル: JumonyUrlHelper.cs プロジェクト: neo2018/Jumony
        /// <summary>
        /// 从元素标签中获取路由的虚拟路径
        /// </summary>
        /// <param name="element">要获取分析路由虚拟路径的元素</param>
        /// <param name="clearRouteAttributes">是否清理路由属性设置</param>
        /// <returns>获取的虚拟路径</returns>
        internal string GetRouteUrl( IHtmlElement element, bool clearRouteAttributes )
        {
            if ( element == null )
            throw new ArgumentNullException( "element" );

              if ( element.Attribute( "action" ) == null )
            throw new InvalidOperationException();

              var action = element.Attribute( "action" ).Value() ?? RouteData.Values["action"].CastTo<string>();
              var controller = element.Attribute( "controller" ).Value() ?? RouteData.Values["controller"].CastTo<string>();

              var routeValues = GetRouteValues( element, clearRouteAttributes );

              if ( clearRouteAttributes )
              {
            element.RemoveAttribute( "action" );
            element.RemoveAttribute( "controller" );
            element.RemoveAttribute( "inherits" );
              }

              return Url.Action( action, controller, routeValues );
        }