Resoconto del 1° Dexter Raduno
Pubblicato da admin in dexter il 24 luglio 2010 alle 19.58
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
Prossimo raduno per la seconda metà di agosto, non mancate!
Pubblicato da admin in dexter il 24 luglio 2010 alle 19.58
Razor
Pubblicato da admin in MVC il 08 luglio 2010 alle 9.14
Ho perso qulche ora a giocare con Razor il motore che sta dietro WebPages.
Questi i primi risultati ;D
Pubblicato da admin in MVC il 08 luglio 2010 alle 9.14
Questione di virgole
Pubblicato da andrea in Various il 09 giugno 2010 alle 23.19
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
andiamo in debug e mettiamo un watch
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
Chrome 5.0.375.70 beta
Anche chrome si prende la briga di considerare l’array da 3
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.
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
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.
Conclusioni
- L’unico debugger a visualizzare correttamente la lista è Firebug che mostra un bel "undefined”
- Explorer8 ha un comportamento differente dagli altri browser mentre IE9 si allinea al comportamento di FireFox e Chrome
- Quando possibile far generare il Json da c#
Pubblicato da andrea in Various il 09 giugno 2010 alle 23.19
NHibernate Day
Pubblicato da andrea in NHibernate il 18 maggio 2010 alle 11.00
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.
Pubblicato da andrea in NHibernate il 18 maggio 2010 alle 11.00
Creare un EditorTemplate per gli enum con MVC 2
Pubblicato da andrea in MVC il 05 maggio 2010 alle 9.00
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:
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
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.
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..
e se diamo un’occhiata al sorgente HTML troviamo
decisamente meglio.
Pubblicato da andrea in MVC il 05 maggio 2010 alle 9.00
Visual Studio 2010 Community Launch Tour - Perugia
Pubblicato da andrea in DotNetMarche il 02 maggio 2010 alle 14.44
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!
Pubblicato da andrea in DotNetMarche il 02 maggio 2010 alle 14.44

