private static MvcHtmlString SmartLabelFor <TModel, TValue>(
            this HtmlHelper <TModel> helper,
            Expression <Func <TModel, TValue> > expression,
            SmartResourceDisplayName resourceDisplayName,
            ModelMetadata metadata,
            bool displayHint      = true,
            object htmlAttributes = null)
        {
            var    result    = new StringBuilder();
            string labelText = null;
            string hint      = null;

            if (resourceDisplayName != null)
            {
                // resolve label display name
                labelText = resourceDisplayName.DisplayName.NullEmpty();
                if (labelText == null)
                {
                    // take reskey as absolute fallback
                    labelText = resourceDisplayName.ResourceKey;
                }

                // resolve hint
                if (displayHint)
                {
                    var langId = EngineContext.Current.Resolve <IWorkContext>().WorkingLanguage.Id;
                    hint = EngineContext.Current.Resolve <ILocalizationService>().GetResource(resourceDisplayName.ResourceKey + ".Hint", langId, false, "", true);
                }
            }

            if (labelText == null)
            {
                labelText = metadata.PropertyName.SplitPascalCase();
            }

            var label = helper.LabelFor(expression, labelText, htmlAttributes);

            if (displayHint)
            {
                result.Append("<div class='ctl-label'>");
                {
                    result.Append(label);
                    if (hint.HasValue())
                    {
                        result.Append(helper.Hint(hint).ToHtmlString());
                    }
                }
                result.Append("</div>");
            }
            else
            {
                result.Append(label);
            }

            return(MvcHtmlString.Create(result.ToString()));
        }
        public static MvcHtmlString SmartLabelFor <TModel, TValue>(
            this HtmlHelper <TModel> helper,
            Expression <Func <TModel, TValue> > expression,
            string resourceKey,
            bool displayHint      = true,
            object htmlAttributes = null)
        {
            Guard.ArgumentNotEmpty(() => resourceKey);

            var metadata            = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
            var resourceDisplayName = new SmartResourceDisplayName(resourceKey, metadata.PropertyName);

            return(SmartLabelFor(helper, expression, resourceDisplayName, metadata, displayHint, htmlAttributes));
        }