Resoconto del 1° Dexter Raduno

Oggi ho avuto il piacere di pranzare con Ugo e Alessandro per fare quattro chiacchiere su Dexter.

Tanto per stare leggeri Ugo ci ha deliziato portandoci in un ristorantino sul lungomare di San Benedetto a strafogarci di pesce e tra due chiacchiere su NHibernate 3, su Razor e sulla direzione da dare a Dexter il tempo è volato via.

Ringrazio Ugo per essersi sbattuto con Mauro nel procurarmi un iPad e per aver deciso di regalarmi un abbonamento MSDN Ultimate che metterò a frutto per studiare per bene le funzionalità avanzate di VS2010.

Grazie al team di Dexter e a tutto l’ecosistema della Community .Net, è un vero piacere avere a che fare con il gruppo di pazzi scatenati quali siete ;D

DSC_0139

Prossimo raduno per la seconda metà di agosto, non mancate!

0 commenti

Community, Dexter, DotNetMarche, Opensource

[top]

Razor

Ho perso qulche ora a giocare con Razor il motore che sta dietro WebPages.

Questi i primi risultati ;D

shave

0 commenti

Aspnetmvc, Codegen, Razor

[top]

Questione di virgole

Ho riscontrato un problema in un js nella manipolazione di un oggetto esperesso in notazione Json e ho utilizzato il debugger js integrato del browser per diagnosticarlo.

Questo è il codice che crea il problema cercando di accedere ad un oggetto non definito

<html>
<head><title>Watch test</title></head>
<body>
<script type="text/javascript">
var list = [{value:1}, {value:2},{value:3},];
for(var c = 0; c < list.length; c++){
    var elem = list[c];
    document.write(elem.value);
}
</script>
</body>
</html>

Notare la virgola  prima della chisura dell’array: questo implica che il nostro array ha un elemento undefined in più, quindi il sull’ultimo elemento il js si pianta tentando di accedere ad una proprietà di un oggetto undefined.

Ecco cosa accade con i vari browser

Primo test: elemento undefined in fondo all’array

Internet Explorer 8
L’errore viene puntualmente identificato

image

andiamo in debug e mettiamo un watch

image

Il nostro array è composto da 3 elementi ma è lungo 4!

Internet Explorer 9 platform preview
Non si aggancia il debugger all’istanza, ma l’errore non si presenta se la pagina è messa in modalità “IE9 Document Mode” mentre nelle altre modalità è presente.

Firefox 3.6 beta 4 + Firebug
Firefox se ne frega bellamente, l’array è da 3: nessun errore

image

Chrome 5.0.375.70 beta
Anche chrome si prende la briga di considerare l’array da 3

image

 

Secondo test: elemento undefined in mezzo all’array

<html>
<head><title>Watch test</title></head>
<body>
<script type="text/javascript">
var list = [{value:1}, {value:2},,{value:3}];
for(var c = 0; c < list.length; c++){
    var elem = list[c];
    document.write(elem.value);
}
    document.write('fine');
</script>
</body>
</html>

Internet Explorer 8
Per explorer non è cambiato nulla, l’array è sempre da 4 e l’errore si presenta puntualmente.

image

Internet Explorer 9 platform preview
Errore sempre presente, ma è impossibile valutare il debugger.

Firefox 3.6 beta 4 + Firebug
L’array è da 4 elementi di cui uno undefined

image

Chrome 5.0.375.70 beta
Anche per Chrome le cose non sono cambiate.
L’errore viene visualizzato solamente con i tool di sviluppo attivi.

image

Conclusioni

  1. L’unico debugger a visualizzare correttamente la lista è Firebug che mostra un bel "undefined”
  2. Explorer8 ha un comportamento differente dagli altri browser mentre IE9 si allinea al comportamento di FireFox e Chrome
  3. Quando possibile far generare il Json da c#
0 commenti

Browser, Debugger, Javascript

[top]

NHibernate Day

DotNetMarche e UgiAlt.Net hanno unito le forze per creare il primo evento dedicado ad NHibernate in Italia. Per i dettagli rimando al post di Simone ed al sito dedicato realizzato grazie all’infaticabile Claudio.

image

Let the fun begin!

0 commenti

DotNetMarche, Evento, NHibernate

[top]

Creare un EditorTemplate per gli enum con MVC 2

Intro

Nelle mie applicazioni faccio largo uso di enums (e chi non lo fa?), mi sono quindi creato una serie di helpers / providers per la gestione della UI bindata con gli enum.

In WebForms utilizzo:

  • IEnumDescriptionProvider: servizio che estrapola le descrizioni.
    • LocalizedEnumDescriptionProvider per le descrizioni localizzate
    • AttributeEnumDescriptionProvider per leggere degli attributi custom
    • AutomaticCaseEnumDescriptionProvider per la conversione automatica al cambio di case (UnValore –> Un Valore)
    • DefaultEnumDescriptionProvider che fa il semplice ToString()
  • IDropDownItemsProvider per creare le liste di valori da passare alle dropdown.
    • DefaultEnumDropDownItemsProvider che ha per chiave il valore numerico dell’enum e per testo la descrizione estrapolata tramite i provider.

 

Visto che MVC2 è estendibile ho provato a riportare le funzionalità di base su questa piattaforma.

Questo è il model

public class Movie
{
    [Required]
    public string Title { get; set; }
    public Rating Rating { get; set; }
}

e questo l’enum

public enum Rating 
{
    None,
    Horrible,
    Bad,
    Poor,
    BelowAverage,
    Average,
    AboveAverage,
    Good,
    VeryGood,
    Superb,
    Excellent
}
Sfruttando il nuovo motore di template possiamo scrivere la form di inserimento dati come
<% using (Html.BeginForm()){%>
   <%= Html.EditorForModel() %>
   <input type="submit" value="Create" />
<%}%>

Il risultato è il seguente:

image

Decisamente poco user friendly.

Step 1 – gestire le descrizioni tramite attributo

MVC2 utilizza DataAnnotations e l’attributo DisplayNameAttribute per poter impostare una label custom sui controlli. Purtroppo l’attributo DisplayNameAttribute non è utilizzabile direttamente sul singolo valore dell’enum. Bypassiamo il problema creando la nostra versione e cambiando l’AttributeUsage

[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Field)]
public class EnumDisplayNameAttribute : DisplayNameAttribute
{
    public EnumDisplayNameAttribute(string displayName)
        :base(displayName)
    {
    }
}

In questo modo è possibile decorare l’enum

[EnumDisplayName("** Rating")]
public enum Rating 
{
    None,
    Horrible,
    Bad,
    Poor,
    [EnumDisplayName("Below Average")]
    BelowAverage,
    Average,
    [EnumDisplayName("Above Average")]
    AboveAverage,
    Good,
    [EnumDisplayName("Very Good")]
    VeryGood,
    Superb,
    [EnumDisplayName("Just... WOW!")]
    Excellent
}

Step 2 – estendere l’enum

Abbiamo bisogno di leggere il valore degli enum e di poter creare una lista di valori da passare al controllo DropDown. Implementiamo entrambe le funzionalità come Extension Methods

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace EnumTemplates.Helpers
{
    public static class EnumExtensions
    {
        public static string GetDisplayName(this Enum enumItem)
        {
            var mi = enumItem.GetType().GetMember(enumItem.ToString()).FirstOrDefault();
            if(mi != null)
            {
                var dn = (EnumDisplayNameAttribute)(mi.GetCustomAttributes(typeof(EnumDisplayNameAttribute), false)).FirstOrDefault();
                if (dn != null)
                    return dn.DisplayName;
            }

            return enumItem.ToString();
        }

        public static IEnumerable<SelectListItem> ToSelectList(this Enum enumItem)
        {
            var enumType = enumItem.GetType();

            return (from object value in Enum.GetValues(enumType)
                    select new SelectListItem
                               {
                                   Selected = value.ToString() == enumItem.ToString(), 
                                   Text = ((Enum)value).GetDisplayName(), 
                                   Value = ((int)value).ToString()
                               }).ToList();
        }
    }
}

Step 3 – Creare un template di default per gli Enum

Nella cartella Views\Shared\EditorTemplates creiamo un nuovo usercontrol Enum.ascx

image

il cui sorgente è il seguente

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Enum>" %>
<%@ Import Namespace="EnumTemplates.Helpers" %>
<%= Html.DropDownListFor(x => x,Model.ToSelectList()) %>

Step 4 – Abilitare il template per il nostro Enum

Piuttosto che decorare con l’attributo UIHint ogni property del nostro ViewModel (che è un approccio decisamente poco DRY) proviamo a decorare direttamente l’enum Ratings.

image

Anche in questo caso ci sono limitazioni sull’utilizzo dell’attributo, la soluzione la conosciamo già ;D

using System;
using System.ComponentModel.DataAnnotations;

namespace EnumTemplates.Helpers
{
    [AttributeUsage(AttributeTargets.Enum)]
    public class EnumUIHintAttribute : UIHintAttribute
    {
        public EnumUIHintAttribute(string uiHint)
            : base(uiHint)
        {
            
        }
    }
}

a questo punto possiamo definire il nostro enumerativo come

using EnumTemplates.Helpers;

namespace EnumTemplates.Models
{
    [EnumDisplayName("** Rating")]
    [EnumUIHint("Enum")]
    public enum Rating 
    {
        None,
        Horrible,
        Bad,
        Poor,
        [EnumDisplayName("Below Average")]
        BelowAverage,
        Average,
        [EnumDisplayName("Above Average")]
        AboveAverage,
        Good,
        [EnumDisplayName("Very Good")]
        VeryGood,
        Superb,
        [EnumDisplayName("Just... WOW!")]
        Excellent
    }
}

Step 5 – Up & Running

Step fondamentale…. F5 e test nel browser..

 

image 

e se diamo un’occhiata al sorgente HTML troviamo

image

decisamente meglio.

Sorgenti

3 commenti

Aspnetmvc, Attributes, Enums, Templates

[top]

Visual Studio 2010 Community Launch Tour - Perugia

Giovedì scorso ho avuto l’onore di presentare MVC2 al Community Tour di lancio di Visual Studio 2010 in quel di Perugia: raccolgo in questo post qualche considerazione in merito ed i link al materiale.

Prima di tutto ringrazio i partecipanti che restando ben oltre il tempo previsto hanno seguito con attenzione la sessione si MVC2 che è stata rivista “on the fly” in base ai feedback.

La sessione era nata per mostrare le novità di MVC2 rispetto alla versione precedente ma già alla prima domanda ai partecipanti ha cambiato direzione.

Prima domanda: “Chi conosce MVC?”… e nessun braccio alzato.

Seconda domanda: “Preferite una sessione slide o codice?”… risposta scontata.. Codice

In 30 secondi polverizzato il lavoro fatto per preparare la mia sessione, non male come inizio.

Alla fine è andata bene, l’attenzione è stata alta fino alla fine (oltre le 19.00) e i primi feedback sono sembrati più che buoni.

Probabilmente manca un evento hands-on (ipotesi di cui discuto da tempo con i ragazzi della community) per dare una bella spinta nella direzione giusta e far toccare con mano i benefici di MVC. Magari dopo l’estate si organizza qualcosa… stay tuned!

 

Codice e slide scaricabili da http://ienumerable.codeplex.com/SourceControl/changeset/changes/99c1cc2736db 0 commenti

Aspnetmvc, Codeplex, DotNetMarche, DotNetUmbria, VS2010

[top]

 1 di 5   1   2   3  »  Last » 
Andrea Balducci - IEnumerable.it