Arquivo

Archive for the ‘Problemas / Troubles’ Category

AngularJs + Ui-Router – Controller sendo inicializado mais de uma vez

04 - 15 2 comentários

Desenvolvendo um frontend com angularjs, me deparei com um pequeno problema.

Contexto:

-> View que permite o usuário consultar o seus dados pessoais, e editá-los.

Controller:

-> Consome uma API /api/account/getdadosprofile, e atualiza a tela com os dados retornados.

Código abaixo: Configuração da minha rota utilizando plug-ins “ui-router” e “ocLazyLoad“.

.state("profile.account", {
            url: "/account",
            templateUrl: "views/profile/profile.account.html",
            data: { pageTitle: 'Minha Conta', pageSubTitle: 'dados da conta' },
            controller: "dadosUsuarioController",
            resolve: {
                deps: ['$ocLazyLoad', function ($ocLazyLoad) {
                    return $ocLazyLoad.load({
                        name: 'MyApp',
                        insertBefore: '#ng_load_plugins_before', // load the above css files before '#ng_load_plugins_before'
                        files: [
                            'js/controllers/dadosUsuarioController.js'
                        ]
                    });
                }]
            }
        })

Estou utilizando ui-router para fazer o roteamento das minhas views.

O data-bind estava funcionando corretamente na minha view, mas percebi utilizando as Developer Tools do Browser (F12), na aba Network, que estavam sendo executadas 4 requests para a API.

O problema disso? Tráfego desnecessário(e duplicado) de dados sendo feito entre client/server.

Investigando bastante a solução, passei pela documentação oficial do ui-router, e li artigos focados em ui-router, mas encontrei a resposta no seguinte post do StackOverflow:

http://stackoverflow.com/questions/15535336/combating-angularjs-executing-controller-twice

No stackOverflow a resposta/explicação se baseou no roteamento nativo do angularJs, mas percebi que isso se aplicava também no “ui-router”. A questão é: Quando especificamos o parâmetro “controller” na rota, esse controller é injetado automaticamente na minha view/template. Por não saber disso, eu declarava o controller manualmente na div.

<div ng-controller="dadosUsuarioController"> // motivo do controller ser executado 2 vezes
   // dessa forma a solução é: 1: remover a diretiva acima, 2: remover o parâmetro controller na sua rota.
</div>

Pessoal, em suma é isso, dúvidas/sugestões, enviem pelos comentários.

Abraço.

Editor de arquivos Razor muito lento no Visual Studio 2013 com Resharper 8, DevExpress 13.2

Quero compartilhar a solução para um problema que me atrapalhou bastante.

Consegui solucionar um problema de lentidão no Visual Studio, ao editar arquivos Razor .cshtml. Chegava ao ponto do cursor desaparecer enquanto editava o arquivo, de tão lento que estava.

Associei isso a um problema que tive ao atualizar o Windows 8 para 8.1 no notebook, pois era incompatível com o driver gráfico comutável do Dell 3540, e a partir disso desativei a Aceleração de Hardware do Visual Studio (não resolveu).

Identifiquei que a lentidão só ocorria com o ReSharper instalado. Desinstalando o Resharper a lentidão extrema desaparecia.

Pesquisei melhor na web até encontrar 2 links:

http://youtrack.jetbrains.com/issue/RSRP-401187

https://www.devexpress.com/Support/Center/Question/Details/Q554979

Aparentemente é um problema quando ReSharper e DevExpress estão instalados. Não uso CodeRush instalado.

Soluções:

* HotFix do DevExpress.

* Hotfix do Resharper.

* Apagar conteúdo da pasta c:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\DevExpress\VSMenuIntegration\ (FUNCIONOU PRA MIM)

Unique Constraint – Entity Framework 6 – WTF

Iniciei um projeto em C# Windows Forms utilizando o Entity Framework 6 (última versão até o momento 05/01/2014).

Tenho um campo que armazena “e-mail”, e esse campo deve ser único na tabela.

Estou mapeando minhas classes utilizando FLUENT API.

e quando fui mapear a coluna E-MAIL fiquei assustado em descobrir que,

a versão 6 desse ORM  não tem esse recurso básico implementado na interface de mapeamento fluente.

Tem uma issue aberta no Codeplex para o tema:
https://entityframework.codeplex.com/workitem/57

Nesse momento reconsidero continuar o projeto em EF ou migrar urgentemente para NHIBERNATE que está anos-luz mais maduro.

Problema com Bind em ListPicker.SelectedIndex

Utilizando uma classe View Model para fazer um “one way” ou “two way” bind na propriedade SelectedIndex de um List Picker é levantada a seguinte exceção: “SelectedIndex must always be set to a valid value.”

Tomando como exemplo o seguinte cenário:

Código XAML:

<Grid x:Name="LayoutRoot">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>

    <toolkit:ListPicker
        Grid.Row="0"
        x:Name="List1"
        SelectionChanged="Picker_SelectionChanged"
        SelectedIndex="{Binding PickerSelectedIndex, Mode=TwoWay}"
        ItemTemplate="{StaticResource PickerTemplate}"
        ItemsSource="{Binding MyList}"/>
</Grid>

E o código no DataContext da página:

 private ObservableCollection<MyClass> myList = null;
    public ObservableCollection<MyClass> MyList
    {
        get { return this.myList; }
        set
        {
            if (value != this.myList)
            {
                this.myList= value;
                NotifyPropertyChanged("MyList");

                this.PickerSelectedIndex = 0;
            }
        }
    }

    private int pickerSelectedIndex = 0;
    public int PickerSelectedIndex
    {
        get
        {
            return this.pickerSelectedIndex;
        }
        set
        {
            this.pickerSelectedIndex= value;
        }
    }

Solução:

Aparentemente, no processo de conversão do XAML em objeto, o ItemsSource deve aparecer antes da propriedade SelectedIndex, isso deve resolver o problema.

<toolkit:ListPicker
    Grid.Row="0"
    x:Name="List1"
    SelectionChanged="Picker_SelectionChanged"
    ItemTemplate="{StaticResource PickerTemplate}"
    ItemsSource="{Binding MyList}"
    SelectedIndex="{Binding PickerSelectedIndex, Mode=TwoWay}"/>

Atenção Desenvolvedores Windows Phone: Aplicativo publicado não aparece no Marketplace

01 - 12 2 comentários

Atenção desenvolvedores, se seu aplicativo recém publicado para Windows Phone não aparece no marketplace pt-BR mas já existem downloads de outros países…

Fique atento…

Aparentemente o marketplace trabalha com cache, e o cache do servidor no Brasil não é atualizado com frequência.

Mancada!!!

Vejam as provas de um caso ocorrido com meu amigo Rodrigo Bandeira, que lançou um app para Conversão de Moedas.
O aplicativo é direcionado para Português, mas só aparece no Marketplace versão en-US e não na versão pt-BR.

Link para Marketplace en-US: http://www.windowsphone.com/en-US/apps/c23b3599-d63c-42a3-afdf-ca052e35a888

Leia mais…

Problem: File upload with jQuery Mobile and ASP.NET MVC

09 - 11 2 comentários

Desenvolvendo um projeto utilizando jQuery Mobile me deparei com um problema:

Código da View:

@using (Html.BeginForm("Gravar", "Foto", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
            <div class="editor-label">Arquivo de foto</div>
            <div class="editor-field">

            </div>

                <div class="ui-block-a">@Html.ActionLink("Home", "Index", null, new {@data_role = "button"})</div>
                <div class="ui-block-b">Enviar</div>

        </div>
    </div>
}

Código da Action:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Gravar(HttpPostedFileBase arquivo)
{
    try
    {
        if (arquivo == null)
            throw new Exception("Foto não foi recebida!");

        // código para persistir arquivo no servidor

        return RedirectToAction("Index");
    }
    catch (Exception)
    {
        return Redirect("Error");
    }
}

Utilizando jQuery Mobile, sempre que o form é submetido, o arquivo para upload não é enviado junto ao form.
(arquivo é sempre null)

Encontrei uma thread no Forum ASP.NET, mas que não funcionou no meu caso.
http://forums.asp.net/t/1666012.aspx/1

Então lendo a documentação do jQuery Mobile atentamente eis a SOLUÇÃO:

Só é necessário decorar o form que posta o arquivo com: data-ajax=”false”.

Explicação melhor abaixo:

File Inputs

Using a multipart form with a file input is not supported by ajax. In this case you should decorate the parent form with data-ajax=”false” to ensure the form is submitted properly to the server.

Dica: Criando grid mestre/detalhe em Runtime com DevExpress

Após encontrar alguma dificuldade em criar um grid CHILD para DevExpress em tempo de runtime, encontrei a seguinte solução:

public partial class Form1 : Form {
 public Form1() {
 InitializeComponent();
 NorthwindEntities northwind = new NorthwindEntities();
 ObjectQuery customersQuery = northwind.Customers.Include(“Orders”);
 gridControl1.DataSource = new BindingSource(customersQuery, “”);
 }

private void gridView1_MasterRowEmpty(object sender, DevExpress.XtraGrid.Views.Grid.MasterRowEmptyEventArgs e) {
 Customers c = (Customers)gridView1.GetRow(e.RowHandle);
 e.IsEmpty = c.Orders.Count == 0;
 }

private void gridView1_MasterRowGetRelationCount(object sender, DevExpress.XtraGrid.Views.Grid.MasterRowGetRelationCountEventArgs e) {
 e.RelationCount = 1;
 }

private void gridView1_MasterRowGetRelationName(object sender, DevExpress.XtraGrid.Views.Grid.MasterRowGetRelationNameEventArgs e) {
 e.RelationName = “Orders”;
 }

private void gridView1_MasterRowGetChildList(object sender, DevExpress.XtraGrid.Views.Grid.MasterRowGetChildListEventArgs e) {
 Customers c = (Customers)gridView1.GetRow(e.RowHandle);
 e.ChildList = new BindingSource(c, “Orders”);
 }
 }

Resumindo:
Implementa-se 4 eventos: MasterRowEmpty, MasterRowGetRelationCount, MasterRowGetRelationName e MasterRowGetChildList.
E problema resolvido.

Fonte: http://devexpress.com/Support/Center/p/Q182589.aspx?searchtext=master+detail

Dica: Acessando ServiceReference em Class Library com C#

Problema:
Ao tentar acessar web service registrado em Class Library obtive o seguinte erro:

Could not find default endpoint element that references contract….

Solução:

EndpointAddress endpointAddress = new EndpointAddress("HTTP://endereco.com/service.asmx");
BasicHttpBinding binding1 = new BasicHttpBinding(BasicHttpSecurityMode.None);
var servico = new ServiceTeste.ServiceSoapClient(binding1, endpointAddress);

Dessa forma Endpoint e o Binding padrão do serviço serão criados dinamicamente.

Fonte: C# & ASP.Net – Kishore Gorjala: WCF Client without app.config/web.config

http://csharpaspnet.blogspot.com/2009/01/wcf-client-without-appconfigwebconfig.htm

dotnettips.wordpress.com/

Helping Programmers Since 1994

Viagem e Voo

Dicas para viagens, férias e voos nacionais e internacionais

Ivan Guimarães Meirelles

Analista Desenvolvedor

Void Podcast

Vazio e sem retorno de valor

Elemar DEV

Negócios, tecnologia e desenvolvimento

2,000 Things You Should Know About WPF

Everything a WPF Developer Needs to Know, in Bite-Sized Chunks

blog

so long

Fernando Franzini Blog

Engenharia de Software e Arquitetura Ágil

Gabriel RB.net

Blog técnico, com dicas, códigos, novidades e problemas do dia-a-dia programando.

Alexandre Valente's Blog

Experiências em tecnologia e assuntos diversos

%d blogueiros gostam disto: