Bootstrap C# Dicas HOW TO jQuery

Script para setar foco em aba que contém inválido

Fala galera.

Vou deixar aqui esse scriptizinho.

$("form").on('submit', function() {
    if (this.hasChildNodes('.nav .nav-tabs')) {
        var validator = $(this).validate();
        $(this).find("input").each(function() {
            if (!validator.element(this)) {
                $('.nav-tabs a[href="#' + $(this).closest('.tab-pane:not(.active)').attr('id') + '"]').tab('show');
                return false;
            }
        });
    }
});
Ajax ASP.NET MVC C# Dicas HOW TO jQuery JSON Útil

HTMLHelper AutoCompleteFor com typeahead.js e bloodhound.js

Fala galera.

Hoje vou postar algo que há bastante tempo queria fazer e sempre adiava. Um HTMLHelper de autocomplete genérico.

Para isso eu utilizei typeahead.js e bloodhound.js.

O HTMLHelper funciona tanto no modo remote como no modo prefetch. Particularmente prefiro utilizar com o prefetch, ele armazena dos dados no localStorage do browser e você pode setar uma expiração para os dados armazenados.

Ressalto a vocês que os recursos typeahead e do bloodhound são vastos e eu não estou utilizando todos, é interessante que vocês leiam a documentação para poder se aprofundar.

Vocês podem baixar a solução nesse link.

Dicas HOW TO Microsoft SQL Server T-SQL Útil

Select para buscar registros duplicados

Fala galera.

Recentemente precisei fazer uma apuração destas, em uma tabela na qual existe um coluna de ano e uma coluna de sequencial.

De acordo com o negócio, um sequencial não poderia se repetir em um determinado ano.

SELECT
    SEQ, ANO, COUNT(*) AS CONTADOR
FROM
    CORRESPONDENCIAS
GROUP BY
    SEQ, ANO
HAVING 
    COUNT(*) > 1
ORDER BY ANO, SEQ
C# Dicas HOW TO Útil

Como copiar a estrutura pastas e arquivos de um diretório

Fala galera! Feliz ano novo!

Dicazinha simples, vai servir mais para servir de “backup” para mim. hehe

var pathOrigem = @"C:\Temp\Origem";
var pathDestino = @"C:\Temp\Destino";

if (Directory.Exists(pathOrigem) && !Directory.Exists(pathDestino))
{
    //criando pastas
    foreach (var path in Directory.GetDirectories(pathOrigem, "*", SearchOption.AllDirectories))
        Directory.CreateDirectory(path.Replace(pathOrigem, pathDestino));

    //copiando arquivos
    foreach (var arquivos in Directory.GetFiles(pathOrigem, "*.*",SearchOption.AllDirectories))
        System.IO.File.Copy(arquivos, arquivos.Replace(pathOrigem, pathDestino), true);
}
C# Dicas HOW TO Útil

Criptografia RSA em C# usando uma chave pública

Fala galera,

Essa semana precisei mexer com criptografia RSA para autenticação em um webservice, onde é preciso enviar as informações de login e senha criptografadas utilizando uma chave pública.

Achei vários exemplos de como fazer (inclusive uns bem complexos), segue abaixo os que achei mais simples:

class Program
{
    static void Main(string[] args)
    {
        //1ª forma
        const string chavePublica = "<RSAKeyValue><Modulus>0T+cB1Xbnz3GhopJhmopF0UBStuREv6fQ6OQQVnietwlXIMjSVQLrrRRNK/fPw9dtn" +
                                    "U15641copbWG7CC1ggCxpT8W4evi0iyjQva7hjS8ZCG2a/zABlnbu9t3Oa+FFfpjRB0G2qZDpbpU+PS99rRVtSUj2slcN" +
                                    "RTZWI1qSTaCk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";



        var texto = Encoding.UTF8.GetBytes("usuariosenha");

        using (var rsa = new RSACryptoServiceProvider())
        {
            try
            {
                rsa.FromXmlString(chavePublica);
                var encryptedData = rsa.Encrypt(texto, false);
                
                //Base64
                //var base64Encrypted = Convert.ToBase64String(encryptedData);
                //Console.WriteLine(base64Encrypted);

                //Hex
                var sb = new StringBuilder();
                foreach (var b in encryptedData)
                    sb.Append(b.ToString("X2"));

                Console.WriteLine(sb.ToString());
                
            }
            finally
            {
                rsa.PersistKeyInCsp = false;
            }

        }

        //2ª forma
        var rsaPublic = new RSACryptoServiceProvider();
        rsaPublic.FromXmlString(chavePublica);
        var encryptedRSA = rsaPublic.Encrypt(texto, false);
        
        //Base64
        //Console.WriteLine(Convert.ToBase64String(encryptedRSA));
       
        //Hex
        var sb2 = new StringBuilder();
        foreach (var b in encryptedRSA)
            sb2.Append(b.ToString("X2"));

        Console.WriteLine(sb2.ToString());

        Console.ReadKey();
    }
}
Dicas HOW TO T-SQL Útil

Como usar TOP em selects com UNION

Fala galera.

Post rápido que vai servir mais como “backup” de conhecimento para mim do que parar vocês. hehe

SELECT  TOP 200 *
FROM    (

SELECT NOME, EMAIL FROM CLIENTES

UNION 

SELECT NOME, EMAIL FROM FORNECEDORES

) as consulta
ASP.NET MVC Bootstrap Dicas HOW TO JavaScript jQuery Razor Útil

jQuery para clonar uma linha de uma tabela e resetar os índices

Fala galera.

Aqui eu falei sobre como enviar uma lista em um POST, e disse que o “segredo” está no index.

Pois bem, surgiu um cenário em que o usuário poderá adicionar linhas (clonadas, logo abaixo da anterior) dinamicamente, ou seja, o índice precisará ser reorganizado.

Para fazer isso pedi ajuda a um amigo (Tobias, obrigado por mais essa.) e ficou assim:

@model List<WebMetas.ViewModels.ProdutoMetaViewModel>
@{
    ViewBag.Title = "Incluir - Meta";
}
@using (Html.BeginForm("Create", "Meta", FormMethod.Post))
{
@Html.AntiForgeryToken()
<table class="table table-bordered table-striped table-hover table-responsive dt-responsive">
    <thead>
        <tr>
            <th class="text-center col-sm-1"></th>
            <th class="text-center col-sm-2">Descrição</th>
            <th class="text-center col-sm-2">Qtde</th>
        </tr>
    </thead>
    <tbody>
        @{
            var index = 0;
            foreach (var produto in Model)
            {
                <tr class="linha">
                    <input type="hidden" data-prop="ProdutoId" name="[@index].ProdutoId" id="[@index].ProdutoId" value="@produto.ProdutoId" />
                    <td class="text-center col-sm-1">
                       <a href="#" class="glyphicon glyphicon-plus btnAdicionarLinha"></a>
                    </td>
                    <td>
                        @produto.Descricao
                    </td>
                    <td class="text-right">
                        <input type="text" class="text-right" data-prop="Qtde" name="[@index].Qtde" id="[@index].Qtde" />
                    </td>
                </tr>
                index++;
            }
        }
    </tbody>
</table>
<button type="submit" class="btn  btn-primary"><span class="glyphicon glyphicon-floppy-saved"></span> Salvar</button>
}

<script type="text/javascript">
$('.table').on('click', '.btnAdicionarLinha', function () {
    var $curRow = $(this).closest('tr'),
        $newRow = $curRow.clone(true);
    $curRow.after($newRow);

    var linhas = $(".linha");

    $.each(linhas, function (index, linha) {
        var props = $("[data-prop]", linha);
        $.each(props, function (index2, propi) {
            propi.id = "[" + index + "]." + propi.dataset.prop;
            propi.name = "[" + index + "]." + propi.dataset.prop;
        });
    });
});
</script>

ASP.NET MVC C# Dicas HOW TO Razor Útil

Como enviar uma lista em um POST com ASP.NET MVC

Fala galera!

Essa é uma dica das boas. Quem já teve essa necessidade sabe que não basta fazer uma view strongly typed para que tudo seja resolvido, porém a solução é tão simples quanto.

O exemplo abaixo usei em uma aplicação de controle de metas, em uma tela em que devolvo todos os produtos cadastrados para que o usuário digite a meta.

A grande sacada aí é o index que permite que o model binder faça a interpretação da lista.

public class ProdutoMetaViewModel
{
    public int ProdutoId { get; set; }
    public string Descricao { get; set; }
    public int Qtde { get; set; }
}
@model List<WebMetas.ViewModels.ProdutoMetaViewModel>
@{
    ViewBag.Title = "Incluir - Meta";
}
@using (Html.BeginForm("Create", "Meta", FormMethod.Post))
{
@Html.AntiForgeryToken()
<table class="table table-bordered table-striped table-hover table-responsive dt-responsive">
    <thead>
        <tr>
            <th class="text-center col-sm-2">Descrição</th>
            <th class="text-center col-sm-2">Qtde</th>
        </tr>
    </thead>
    <tbody>
        @{
            var index = 0;
            foreach (var produto in Model)
            {
                <tr>
                    <input type="hidden" name="[@index].ProdutoId" id="[@index].ProdutoId" value="@produto.ProdutoId" />
                    <td>
                        @produto.Descricao
                    </td>
                    <td class="text-right">
                        <input type="text" class="text-right" name="[@index].Qtde" id="[@index].Qtde" />
                    </td>
                </tr>
                index++;
            }
        }
    </tbody>
</table>
<button type="submit" class="btn  btn-primary"><span class="glyphicon glyphicon-floppy-saved"></span> Salvar</button>
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(IEnumerable<ProdutoMetaViewModel> produtos)
{
   //Implementar
} 
Dicas HOW TO JavaScript jQuery Útil

Função jquery para selecionar/deselecionar checkboxes em uma treeview

Fala galera.

Como vocês já devem ter notado, a necessidade de um script como esse é muito comum. Aparentemente é algo simples de se encontrar rapidamente google, porém 99,9999% das códigos que eu encontrava não havia a funcionalidade de desmarcar o checkbox pai quando seus filhos fosse todos desmarcados. Por incrível que pareça, achei alguns que desmarcavam o checkbox pai ao desmarcar qualquer checkbox filho, mas não achava a funcionalidade previamente dita.

Foi então que encontrei esse fiddle salvador da pátria. Inclusive, deixarei um “backup” dele abaixo para caso algum dia esse fiddle seja excluído.

<ul class="tree" id="tree">
    <li>
        <input type="checkbox">Cadastros
        <ul>
            <li>
                <input type="checkbox">Clientes
                <ul>
                    <li><input type="checkbox">Consultar</li>
                    <li><input type="checkbox">Incluir</li>
                    <li><input type="checkbox">Editar</li>
                    <li><input type="checkbox">Excluir</li>
                </ul>
            </li>
        </ul>
    </li>
    <li><input type="checkbox">Financeiro</li>
    <li>
        <input type="checkbox">Controle de Acesso
        <ul>
            <li><input type="checkbox">Dashboard</li>
            <li>
                <input type="checkbox">Usuários
                <ul>
                    <li><input type="checkbox">Consultar</li>
                    <li><input type="checkbox">Incluir</li>
                    <li><input type="checkbox">Editar</li>
                    <li><input type="checkbox">Excluir</li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

<script type="text/javascript">
    $(function () {
        $('li :checkbox').on('click', function () {
            var cur = $(this);
            cur.next().find('input[type=checkbox]').prop('checked', this.checked);
            if (this.checked) {
                cur.parents('li').children('input[type=checkbox]').prop('checked', true);
            } else
                while (cur.attr('id') != 'tree' && !(cur = cur.parent().parent()).find('input:checked').length) {
                    // Keeps unchecking parent inputs as long as none on the current level are checked
                    cur.prev().prop('checked', false);
                }
        });
    });
</script>
Bootstrap Dicas HOW TO JavaScript jQuery

Script para setar foco no primeiro input de um modal bootstrap

Fala galera.

Aparentemente é algo bastante simples, afinal, na própria documentação do bootstrap é informado os eventos do modal. O script é o seguinte:

$(document).on('shown.bs.modal', '.modal', function () {
      $(this).find("input:visible:first").focus();
});

Porém, se o seu modal tiver a class fade, ele não irá funcionar. Ví uma série de maneiras de contornar esse problema, mas nenhuma funcionou para mim. Então decidi, pelo menos por enquanto, retirar a class fade.