none
Gerar tags HTML dinamicamente com configurações do Banco de Dados RRS feed

  • Pergunta

  • Bom dia pessoal tudo bem?

    Estou com uma dúvida de como implementar essas configurações de controles HTML que estão no banco de dados e gerar automaticamente nas views.

    ConfigView

    Utilizando no Windows Forms é bem fácil, mas não sei como implementar no MVC. Alguém ai tem alguma dica, exemplo pronto para que eu possa estudar como fazer? Já fiz algumas classes Helpers Custom. 

    public static class HtmlHelpers   
    {   
         /// <summary>  
         /// Creates an Html helper for an Image  
         /// </summary>   
         /// <param name="helper"></param>   
         /// <param name="src"></param>   
         /// <param name="altText"></param>   
         /// <returns></returns>   
       
         public static MvcHtmlString Image(this HtmlHelper helper, string src, string altText)   
         {   
             var builder = new TagBuilder("img");   
             builder.MergeAttribute("src", src);   
             builder.MergeAttribute("alt", altText);   
             return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing));   
         }   
       
         //create an action link that can display html   
       
         public static MvcHtmlString ActionLinkHtml(this AjaxHelper ajaxHelper, string linkText, string actionName,   
     string controllerName, object routeValues, AjaxOptions ajaxOptions, object htmlAttributes)   
         {   
             var repID = Guid.NewGuid().ToString();   
             var lnk = ajaxHelper.ActionLink(repID, actionName, controllerName, routeValues, ajaxOptions, htmlAttributes);   
             return MvcHtmlString.Create(lnk.ToString().Replace(repID, linkText));   
         }   
       
         //create an action link that can be clicked to sort and has a sorting icon (this is meant to be used to create column headers)   
       
         public static MvcHtmlString ActionLinkSortable(this HtmlHelper helper, string linkText, string actionName,   
     string sortField, string currentSort, object currentDesc)   
         {   
             bool desc = (currentDesc == null) ? false : Convert.ToBoolean(currentDesc);   
             //get link route values   
             var routeValues = new System.Web.Routing.RouteValueDictionary();   
             routeValues.Add("id", sortField);   
             routeValues.Add("desc", (currentSort == sortField) && !desc);   
             //build the tag   
             if (currentSort == sortField) linkText = string.Format("{0} <span class='badge'><span class='glyphicon glyphicon-sort-by-attributes{1}'></span></span>", linkText, (desc) ? "-alt" : "");   
             TagBuilder tagBuilder = new TagBuilder("a");   
             tagBuilder.InnerHtml = linkText;   
             //add url to the link   
             var urlHelper = new UrlHelper(helper.ViewContext.RequestContext);   
             var url = urlHelper.Action(actionName, routeValues);   
             tagBuilder.MergeAttribute("href", url);   
             //put it all together   
             return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal));   
         }   
       
         //custom html helper to output a nicely-formatted address element   
       
         public static MvcHtmlString DisplayAddressFor<TModel, TProperty>(this HtmlHelper<TModel> helper,  
     System.Linq.Expressions.Expression<Func<TModel, TProperty>> expression, bool isEditable = false,   
     object htmlAttributes = null)   
         {   
            var valueGetter = expression.Compile();   
            var model = valueGetter(helper.ViewData.Model) as InGaugeService.Address;   
            var sb = new List<string>();   
            if (model != null)   
            {   
                 if (!string.IsNullOrEmpty(model.AddressLine1)) sb.Add(model.AddressLine1);   
                 if (!string.IsNullOrEmpty(model.AddressLine2)) sb.Add(model.AddressLine2);   
                 if (!string.IsNullOrEmpty(model.AddressLine3)) sb.Add(model.AddressLine3);   
                 if (!string.IsNullOrEmpty(model.City) || !string.IsNullOrEmpty(model.StateRegion) ||  
     !string.IsNullOrEmpty(model.PostalCode)) sb.Add(string.Format("{0}, {1} {2}", model.City,  
     model.StateRegion, model.PostalCode));   
                 if (model.IsoCountry != null) sb.Add(model.IsoCountry.CountryName);   
                 if (model.Latitude != null || model.Longitude != null) sb.Add(string.Format("{0}, {1}",  
     model.Latitude, model.Longitude));   
             }   
       
             var delimeter = (isEditable) ? Environment.NewLine : "<br />";   
             var addr = (isEditable) ? new TagBuilder("textarea") : new TagBuilder("address");   
             addr.MergeAttributes(new System.Web.Routing.RouteValueDictionary(htmlAttributes));   
             addr.InnerHtml = string.Join(delimeter, sb.ToArray());   
             return MvcHtmlString.Create(addr.ToString());   
         }   
         public static string Label(string target, string text)   
         {   
             return String.Format("<label for='{0}'>{1}</label>", target, text);   
         }   
       
         //Submit Button Helper   
         public static MvcHtmlString SubmitButton(this HtmlHelper helper, string buttonText)   
         {   
             string str = "<input type=\"submit\" value=\"" + buttonText + "\" />";   
             return new MvcHtmlString(str);   
         }   
            public static MvcHtmlString Image(this HtmlHelper htmlHelper, 
            	string source, string alternativeText)
            {
                //declare the html helper 
                var builder = new TagBuilder("image"); 
                //hook the properties and add any required logic
                builder.MergeAttribute("src", source);
                builder.MergeAttribute("alt", alternativeText);
                //create the helper with a self closing capability
                return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing));
            } 
     
    //
    // Logic for rendering
    //
    public static MvcHtmlString Div(this HtmlHelper helper, string content)
    {
    var tagBuilder = new TagBuilder("Div");
    tagBuilder.InnerHtml = content;
    return new MvcHtmlString(tagBuilder.ToString());
    }
    
      public static string TextBox(string name, string value)
              {       
                      return String.Format("<input id='{0}’ name='{0}’ value='{1}’ type="text" />", name, value);                   
              }
         
        }
         
        } 

    Outra coisa, como fazer para o controle fique em cache, para não haver necessidade de toda hora em um reload por exemplo a aplicação não precisar ir no banco para recriar os controles..

    Obrigado


    segunda-feira, 10 de outubro de 2016 15:38

Respostas

  • Olá Thyago, tudo bem?

    Vamos lá, basicamente o que você precisa é ou fazer as consultas nos seus TagHelpers (o que eu acho que não é tão bacana) ou você precisa passar os dados para os seus TagHelpers (se você já sabe quais helpers criar, esse é o melhor caminho).

    Eu não entendi bem o que você precisa do banco: apenas os atributos dos controles ou o tipo dos controles também?

    Existem algumas estratégias que você pode utilizar:

    1. Cache dos resultados do banco, caso eles não mudem com frequência
    2. Cache do tag helper (MVC 6)

    Caso você já saiba os tipos dos controles, você pode fazer uma consulta no banco de dados e armazenar isso em um Dictionary<string, Dictionary<string, string>> onde a primeira chave é o tipo do controle, e ele possui um dicionário com as propriedades e valores, algo assim:

        public Dictionary<string, Dictionary<string, string>> ObterConfiguraçõesDeControlesDoBanco()
        {
            var configurações = new Dictionary<string, Dictionary<string, string>>();
    
            //vai ao banco de dados obtem os valores e preenche, por exemplo
            configurações.Add("<p>", new Dictionary<string, string> { {"class", "nomeDaSuaClass"}, {"id", "seuID"} });
    
            return configurações;
        }

    Depois você pode passar este Dictionary para seus taghelpers e utilizar as propriedades que estão lá:

        public static MvcHtmlString GerarControle(this HtmlHelper helper, Dictionary<string, Dictionary<string, string>> configuracoes, string tipo)
        {
            var tagBuilder = new TagBuilder(tipo);
    
            foreach (var atributos in configuracoes[tipo])
                tagBuilder.MergeAttributes(atributos.Key, atributos.Value)
    
            return new MvcHtmlString(tagBuilder.ToString());
        }

    Seria algo mais ou menos assim. Isso ajuda?

     

    segunda-feira, 10 de outubro de 2016 18:13

Todas as Respostas

  • Olá Thyago, tudo bem?

    Vamos lá, basicamente o que você precisa é ou fazer as consultas nos seus TagHelpers (o que eu acho que não é tão bacana) ou você precisa passar os dados para os seus TagHelpers (se você já sabe quais helpers criar, esse é o melhor caminho).

    Eu não entendi bem o que você precisa do banco: apenas os atributos dos controles ou o tipo dos controles também?

    Existem algumas estratégias que você pode utilizar:

    1. Cache dos resultados do banco, caso eles não mudem com frequência
    2. Cache do tag helper (MVC 6)

    Caso você já saiba os tipos dos controles, você pode fazer uma consulta no banco de dados e armazenar isso em um Dictionary<string, Dictionary<string, string>> onde a primeira chave é o tipo do controle, e ele possui um dicionário com as propriedades e valores, algo assim:

        public Dictionary<string, Dictionary<string, string>> ObterConfiguraçõesDeControlesDoBanco()
        {
            var configurações = new Dictionary<string, Dictionary<string, string>>();
    
            //vai ao banco de dados obtem os valores e preenche, por exemplo
            configurações.Add("<p>", new Dictionary<string, string> { {"class", "nomeDaSuaClass"}, {"id", "seuID"} });
    
            return configurações;
        }

    Depois você pode passar este Dictionary para seus taghelpers e utilizar as propriedades que estão lá:

        public static MvcHtmlString GerarControle(this HtmlHelper helper, Dictionary<string, Dictionary<string, string>> configuracoes, string tipo)
        {
            var tagBuilder = new TagBuilder(tipo);
    
            foreach (var atributos in configuracoes[tipo])
                tagBuilder.MergeAttributes(atributos.Key, atributos.Value)
    
            return new MvcHtmlString(tagBuilder.ToString());
        }

    Seria algo mais ou menos assim. Isso ajuda?

     

    segunda-feira, 10 de outubro de 2016 18:13
  • Boa tarde, obrigado pela dica, Exatamente isso obrigado.

    "Eu não entendi bem o que você precisa do banco: apenas os atributos dos controles ou o tipo dos controles também?" 

    Seria ambos, pretendo criar toda configuração do formulário por enquanto para os controles [input, label, button, etc] através de um configurador online, que grava as informações no banco de dados. Assim fica fácil para manipular os controles para cada tipo de cliente.

    segunda-feira, 10 de outubro de 2016 19:37