Por otro lado, tampoco se puede dudar ya de la entrada de la nube en nuestras vidas. Cada vez desplazamos más capacidad de almacenamiento y proceso a infraestructuras fiables y escalables como las ofrecidas por proveedores como Microsoft, Amazon, Google, Oracle y otros, con un coste más que razonable. Esto, sin embargo, presenta un reto a medio y largo plazo: ¿serán las infraestructuras de estos proveedores suficientes como para soportar el crecimiento exponencial en servicios demandados por los usuarios?
Publicado por José M. Aguilar a las 12:10 a. m.
Etiquetas: azure, inocentadas, mobile, novedades
Estimados amigos que estáis siempre ahí, os deseo unas muy felices fiestas navideñas, y espero que podáis compartirlas con familia, amigos y todos aquellos que apreciáis.
Y para el próximo 2013, espero que sea un año repleto de salud, amor, y trabajo (que cada uno elija el orden de estos factores ;-)) y, sobre todo, que sea el año en que se cumplan todos vuestros sueños y esperanzas, que seguro que ya va siendo hora ;-)
Nos seguimos viendo por aquí.
PD: Para los más frikis, os dejo con un post de 2007 de la selección Variable Not Found Classics: “Xmas Tree scan, el escaneo de puertos navideño”.
Sin embargo, nuestras aplicaciones web son muy diferentes cuando el cliente no dispone de una conexión de alta velocidad. Lo que nosotros percibimos en tiempo de desarrollo como una maravilla de agilidad, espectacularidad y facilidad de uso, puede ser un auténtico desastre para el cliente si no hemos tenido en cuenta que no todo el mundo puede disfrutar de conexiones de alta calidad.
Por esta razón, es interesante realizar de vez en cuando pruebas de nuestros sistemas reduciendo de forma artificial el ancho de banda disponible, de forma que podamos detectar en qué puntos podemos mejorar la experiencia del usuario en estos escenarios.
Publicado por José M. Aguilar a las 9:30 a. m.
Etiquetas: depuración, desarrollo, fiddler, trucos, web
Gracias a esto, los desarrolladores podíamos conectarnos fácilmente a un servicio para consultar sus especificaciones técnicas, o incluso generar de forma automática código cliente o proxies que facilitaran el acceso remoto a las funciones publicadas en la red.
Y para los que venimos de esos tiempos, una de las primeras dudas que surgen al comenzar a trabajar con WebAPI es si existe algo similar. Y la respuesta es sí, pero no ;-P
.Net
Publicado por José M. Aguilar a las 9:30 a. m.
Etiquetas: aspnetmvc, desarrollo, trucos, validadores
Espero que os resulten interesantes, al menos como en las 99 entregas anteriores :-)
.Net
También presentamos en aquél momento dos conceptos que resultaban básicos para Knockout.js:
- El binding, que es el mecanismo que permite mapear datos y acciones de la vista a propiedades y métodos del View-Model.
- Las propiedades observables, que son aquellas a las que el framework realiza seguimiento de cambios con objeto de actualizar, cuando sus valores cambien, los elementos que dependan de ellas.
Blogger invitado
Óscar Sotorrío Sánchez
Desarrollador independiente, MCP C#
Eterno aprendiz en esto de las tecnologías .NET y en especial con ASP.NET. Admirador de la filosofía de Internet y entusiasta de los nuevos modelos de negocio que rigen este mundillo. Blog: oscarsotorrio.comEn este artículo vamos a comenzar por identificar en el código cuándo se producen los closures para luego ver qué tienen de especial. Después pasaremos a ver algunos comportamientos que nos servirán para terminar completamente de entender cómo funcionan. Para finalizar, veremos un par de ejemplos de aplicaciones prácticas.
.Net
- Dynamic Code for type casting Generic Types 'generically' in C#
Rick Strahl - Mono 3.0 is out
Miguel de Icaza - Multicore JIT in .NET Framework 4.5
Visit Kalyan Bandarupalli - C#/.NET Little Wonders: Using ‘default’ to Get Default Values
James Michael Hare
Se trata de la obra más reciente del maestro José Manuel Alarcón, nacida con un ambicioso objetivo: ser útil tanto para desarrolladores experimentados que buscan reforzar y ampliar sus conocimientos en Javascript, como para aquellos que desean comenzar trabajar con el lenguaje sin haber tenido contacto previo con el mismo.
Y desde luego, nadie mejor que el autor para conseguirlo: dilatada y reconocida experiencia en el mundo web, en Javascript (publicó su primer libro sobre el tema hace más de diez años), y una forma de escribir muy amena y cercana que hace que las trescientas ochenta páginas del libro se lean con mucha facilidad.
El índice completo podéis consultarlo en Scribd, pero, a grandes rasgos, el libro está dividido en los siguientes bloques:
- Una amplia introducción al lenguaje, en cuyos primeros siete primeros capítulos se comienza a presentar Javascript desde cero, introduciendo ordenada y progresivamente conceptos como las variables, tipos de datos, funciones, operadores, estructuras de control de flujo, uso de matrices, textos, fechas o temporizadores, siempre usando ejemplos simples y directos.
A pesar de que esta primera parte se destina sobre todo a los programadores noveles, me la he zampado por completo y puedo asegurar que he aprendido bastante con ella.
El capítulo 8, que cerraría este bloque, cambia el ritmo de forma considerable entrando en aspectos avanzados, como la definición de objetos, constructores, el uso del siempre intrigante “this”, la herencia basada en prototipos, closures, y ocultación de miembros, entre otros interesantes asuntos.
- Una vez conocido el lenguaje Javascript, a continuación se nos muestra cómo utilizarlo en el contexto de un navegador, realizando un completo recorrido por el DOM y las técnicas que nos permiten manipularlo de forma directa, sin usar jQuery ni frameworks similares. Aprenderemos a localizar elementos de la página, recorrerlos, realizar consultas dinámicas, y a modificar el contenido de la página en tiempo de ejecución.
También se estudia en profundidad el tratamiento de eventos, su funcionamiento interno, los distintos modelos soportados por los navegadores, y cómo implementarlos de forma eficiente, por supuesto sin necesidad de emplear marcos de trabajo externos. Es, además, una referencia completísima de los eventos disponibles para cada tipo de elemento y la forma de procesarlos sin caer en particularidades de navegadores concretos.
Para cerrar este bloque, se dedica un capítulo exclusivamente a hablar de Ajax, el uso del objetoXMLHttpRequest
para enviar y recibir información y los problemas más habituales que surgen cuando usamos esta técnica de intercambio de datos entre cliente y servidor. También se describen soluciones para la comunicación cross-site como JSONP (JSON with Padding), estudiado muy en profundidad, y CORS (Cross-Origin Resource Sharing).
- Un último bloque muy orientado a la práctica, en el que se describen errores más comunes y la forma de trazar y depurar aplicaciones Javascript utilizando herramientas integradas en los navegadores, donde encontramos mecanismos similares a los que estamos acostumbrados en entornos de desarrollo como logs, profilers o breakpoints.
- Por último, se dedica un capítulo en exclusiva para ver cómo lidiar con las misteriosas expresiones regulares, donde se demuestra que con la base adecuada no son tan fieras como parecen ;-)
Con toda seguridad, un must have para todos los que aún no conocen Javascript y desean entrar por la puerta grande, y también para todos los que ya habíamos entrado hace años pero nos hemos ido dejando algunos detalles por el camino ;-)
Publicado en Variable not found.
.Net
- Syntactic Sugar and the Async Pill
Dino Esposito - Functional programming in C#
Jovan Popovic (vía @lluisfranco / @eixeminis) - Is C# a strongly typed or a weakly typed language?
Eric Lippert
Hoy vamos a ver una solución a un problema al que seguro nos hemos enfrentado cientos de veces: la edición en formularios de propiedades de tipo
enum
.1. El escenario
Imaginad que tenemos dos enumeraciones como las siguientes:public enum Color { Black, Blue, Red, Green } public enum Language { English, Spanish, Italian, Portuguese }
Usadas una clase del Modelo tal que:
public class Contact { public string Name { get; set; } public Language MainLanguage { get; set; } public Color? FavouriteColor { get; set; } }Y, a continuación, queremos crear un formulario de edición para la misma, con el código:
<h2>Edit contact</h2> @using(Html.BeginForm()) { @Html.EditorForModel() <input type="submit" value="Send" /> }Como era de esperar, el resultado una vez en ejecución es algo similar a lo que podemos ver en la captura de pantalla de la derecha.
Las propiedades
MailLanguage
y FavouriteColor
, a pesar de ser enumeraciones, muestran como control de edición un simple cuadro de texto en el que podemos introducir cualquier cosa.Y dado que son
enum
y podemos conocer sus valores de antemano, ¿no sería más lógico que la edición de estas propiedades se realizaran utilizando desplegables? 2. Editor template para enums
Sin duda, la fórmula más sencilla y reutilizable para conseguir el objetivo que pretendemos es crear una plantilla de edición personalizada para las enumeraciones.Como seguro sabréis, los editor templates proporcionan un mecanismo para generar controles de edición específicos para tipos de datos; podemos tener un editor para propiedades de tipo
string
(p.e., un cuadro de texto), de tipo DateTime
(p.e., un cuadro de texto con un date picker), etc. Lo único que hay que hacer es crear en la carpeta /Views/Shared/EditorTemplates vistas parciales con el nombre del tipo de datos para el que se desea crear el editor (string.cshtml, datetime.cshtml, etc.).Por tanto, probemos introduciendo el siguiente código en /Views/Shared/EditorTemplates/Enum.cshtml:
@model Enum @{ var isRequired = this.ViewData.ModelMetadata.IsRequired; var type = this.ViewData.ModelMetadata.ModelType; if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) { type = type.GenericTypeArguments[0]; } var values = Enum.GetValues(type); var items = (from object value in values select new SelectListItem { Text = Enum.GetName(type, value), Value = value.ToString() }); } @Html.DropDownListFor(m=>m, items, isRequired ? "Select...": "(None)")Como se puede observar, prácticamente sólo hacemos tres cosas:
- En primer lugar, determinamos la obligatoriedad de la propiedad a editar observando los metadatos del modelo.
- A continuación, creamos una lista de elementos de tipo
SelectListItem
recorriendo los valores disponibles en la enumeración. Observad que es necesario comprobar si el tipo que nos está llegando es anulable (Nullable<TEnum>
) y obtener el tipo de la enumeración de su parámetro genérico. - Por último, usamos DropDownListFor() para generar el desplegable. En caso de tratarse de una propiedad obligatoria, añadimos un primer elemento con el texto “Select…”, y en caso contrario usamos el texto “(None)” para identificar el elemento nulo.
string
) para editar las propiedades de tipo enum
, lo cual nos obliga a indicar en las propiedades la plantilla a utilizar (las dos fórmulas usadas a continuación son equivalentes):public class Contact { public string Name { get; set; } [UIHint("Enum")] public Language MainLanguage { get; set; } [DataType("Enum")] public Color? FavouriteColor { get; set; } }Ya en ejecución, observamos que el resultado ha mejorado notablemente, como se puede apreciar en la captura de pantalla :-)
En este punto podríamos considerar que hemos alcanzado el objetivo que nos proponíamos, pero… ¿no os parece aún demasiado trabajo tener que decorar cada propiedad de tipo enumeración con estos atributos? ¿No podríamos dejar al framework que se encargue de estas minucias?
3. Proporcionando metadatos con metadata providers
Ya hemos hablado por aquí en varias ocasiones de los proveedores de metadatos, o metadata providers. De hecho, si no tienes claro lo que son, te recomendaría que leyeras el post “Mamá, ¿de dónde vienen los metadatos” que publiqué haces unos meses.Muy resumidamente, se trata del mecanismo que obtiene los metadatos de las clases del Modelo desde donde se encuentren definidos. El proveedor por defecto los obtiene examinando las clases y sus propiedades mediante reflexión y obteniendo los atributos (anotaciones) que definen restricciones y otras características, pero podemos crear proveedores personalizados que las extraigan desde otras fuentes.
Y vamos a utilizar esta característica para evitar tener que especificar el atributo
[UIHint]
a las propiedades de tipo enum
. El proveedor cuyo código veremos a continuación hereda del usado por defecto en ASP.NET MVC 4 (CachedDataAnnotationsModelMetadataProvider
) y sobrescribe el procedimiento de obtención de metadatos:public class EnumMetadataProvider: CachedDataAnnotationsModelMetadataProvider { protected override CachedDataAnnotationsModelMetadata CreateMetadataFromPrototype( CachedDataAnnotationsModelMetadata prototype, Func<object> modelAccessor) { var metadata = base.CreateMetadataFromPrototype(prototype, modelAccessor); var type = metadata.ModelType; if (type.IsEnum || (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>) && type.GetGenericArguments().Length == 1 && type.GetGenericArguments()[0].IsEnum)) { metadata.TemplateHint = "Enum"; } return metadata; } }Observad que lo único que estamos haciendo es invocar el método de la clase base y, posteriormente, comprobar si el tipo de la propiedad es un enumerado o un tipo anulable de enumerado, en cuyo caso introduce en la propiedad de metadatos
TemplateHint
el nombre de la plantilla a utilizar (“Enum”).Por último, ya sólo queda establecer un objeto de este tipo como proveedor de metadatos por defecto para la aplicación:
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start() { AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); // ... ModelMetadataProviders.Current = new EnumMetadataProvider(); } }De esta forma, por fin podemos eliminar de nuestra clase del Modelo los molestos atributos y todas las enumeraciones de nuestra aplicación se mostrarán en el formulario con la plantilla de edición que hemos creado anteriormente :-)
Publicado en: Variable Not Found.
.Net
- Cancelling Parallel LINQ Queries
Richard Carr - C#/.NET Little Wonders: Static Char Methods
James Michael Hare - Marking Code as Deprecated in .NET
Jason N. Gaylord
El temario es una completa y profunda revisión del utilizado en el curso de MVC 3, que tan buenas críticas ha recibido por parte de los alumnos que lo han seguido, pero más completo, adaptado a las novedades de la nueva versión, a las nuevas herramientas, y con un enfoque mucho más práctico.
Y para que veáis que no se ha escatimado en recursos, ahí va un vídeo de presentación muy chulo:
.Net
Y Microsoft ha movido ficha. Hace un par de días, S. Somasesegar, vicepresidente corporativo de la división de desarrollo de la casa, presentó un nuevo lenguaje que pretende acabar con las tradicionales carencias de Javascript, al que han denominado TypeScript. Detrás de este nuevo “invento” está el mismísimo Anders Hejlberg, padre de C# y otras maravillas, que ya sabíamos hace tiempo que andaba liado con algo relacionado con Javascript.
Publicado por José M. Aguilar a las 12:07 p. m.
Etiquetas: desarrollo, javascript, novedades, typescript
.Net
- Use Structs Instead of Classes to Pass Data Uniquely
Peter Vogel - Parallel Series: Tasks, la 8ª maravilla
Lluis Franco - File and Folder Timestamps
Richard Carr - C#/.NET Little Wonders: The Timeout static class
James Michael Hare
Y aquí está el resultado, 101 nuevas frases célebres relacionadas con nuestro mundillo, que espero que os gusten tanto como las anteriores.
Este es el cuatro post de la serie compuesta por:
- 101 citas célebres del mundo de la informática
- Otras 101 citas célebres del mundo de la informática
- Y todavía otras 101 citas célebres del mundo de la informática
- 101 nuevas citas célebres del mundo de la informática (¡y van 404!)
Publicado por José M. Aguilar a las 9:30 a. m.
Etiquetas: curiosidades, frases célebres, frikadas, humor
.Net
- Roslyn September 2012 CTP is now available
Eric Lippert - Could not load file or assembly ‘Microsoft.Data.Services, Version=5.0.0.0’
Nick Berardi - WIF y Web Farms
Unai Zorrilla
Url.Action()
o Html.ActionLink()
, éstas son generadas usando mayúsculas y minúsculas según hubiéramos indicado en los parámetros de las llamadas:Helper | URL generada |
---|---|
@Url.Action("index", "home") | /home/index |
@Url.Action("List","Products", new{ Category="PC" }) | /Products/List?Category=PC |
@Url.Action("VIEWALL", "PRODUCTS") | /PRODUCTS/VIEWALL |
Como podemos ver, la URL resultante queda a criterio del desarrollador o, lo que es peor, al puro azar. A veces incluso no es algo que podamos elegir fácilmente, puesto que son generadas por otros componentes como T4MVC. Y no sé si desde el punto de vista del SEO tendrá su impacto, pero desde luego el ofrecer estas direcciones sin un aspecto unificado no da buena impresión.
En versiones anteriores a ASP.NET 4.5, esto podíamos solucionarlo creando helpers, o rutas personalizadas que, heredando de
Route
, realizaran esta conversión a minúsculas. Sin embargo, ahora disponemos de un mecanismo más cómodo para forzar que las URLs generadas sean normalizadas a minúsculas, así:public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.LowercaseUrls = true; routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); [...] } }
Un detalle, sin duda interesante, para tener en cuenta en nuestros desarrollos.
Publicado en: Variable not found.
.Net
- Static analysis of is
Eric Lippert - C# 5.0 Async explained as simple as possible :)
Chris van Beek (vía @pmolinam) - 2012 Update- Running C# on the Browser
Miguel de Icaza - C#/.NET Little Wonders: Interlocked CompareExchange()
James Michael Har - Amazing. What’s new in WPF 4.5?
Jerry Nixon
Asíncronía = bueno
A grandes rasgos, la explicación es la siguiente: IIS tiene disponible un número limitado de hilos (threads) destinados a procesar las peticiones. Cuando llega una petición, uno de estos hilos es asignado en exclusiva a ella y permanecerá ocupado hasta que haya sido totalmente procesada. Si llegan peticiones cuando todos los hilos están ocupados, se introducen en una cola, también limitada. Cuando el tamaño máximo de esta cola ha sido superado, ya al servidor no le queda más remedio que responder con un error HTTP 503 al usuario indicándole que está seriamente ocupado.
.Net
La verdad es que hemos tenido un veranito cargado de novedades. De hecho, nos encontramos a la vuelta de las vacaciones con versiones renovadas en todos los productos que usamos habitualmente para nuestro trabajo: sistemas operativos, plataforma .NET, entorno de desarrollo, EF, MVC… muchos juguetitos nuevos a los que hincarle el diente, y de los que seguro que hablaremos largamente durante los próximos meses.
Dicho esto, ¡queda inaugurada la temporada 2012-2013 de Variable not found!
Como siempre, nos vemos por aquí :-)
Publicado por José M. Aguilar a las 9:15 a. m.
Etiquetas: blogging, variablenotfound, variablenotfound.com
Hasta el próximo mes de Septiembre soltaré el timón de Variable not found y lo dejaré a la deriva, hasta que vuelva con energías renovadas y ánimos para afrontar el próximo año con la misma ilusión y dedicación que siempre.
En cuanto a los planes veraniegos, este año no voy a poder disfrutar de todo el tiempo libre que me
Pero aún así, tendremos tiempo de hacer una nueva escapada a Mallorca, donde ya estuvimos el año pasado y estamos deseando repetir, y seguro que alguna que otra visita fugaz a playas cercanas de Cádiz y Huelva.
Nos vemos en unas semanillas :-)
¡Felices vacaciones, amigos!
.Net
- Evolution of C# (1.0 – 5.0) – What are the New Features Introduced in C#
Kunal Chowdhury - Identity & .NET 4.5, parte I y parte II
Unai Zorrilla - [VS2012] Información del llamante
Javier Torrecilla - Should C# warn on null dereference?
Eric Lippert - Breaking Changes In Argument List Evaluation In C# 5.0
Paulo Morgado - AOP con Castle Windsor: DynamicInterceptionFacility
Juan María Hernández - Tracing System.Net to debug HTTP Clients
Mike Hadlow - C#/.NET Little Wonders: The Nullable<T> struct
James Michael Hare
Asp.net
- ASP.NET MVC HTML Helper for the jqGrid
Rui Inacio - Customize Json result in Web API
Ugo Lattanzi - Multiple file upload with asp.net 4.5 and Visual Studio 2012
Jalpesh Vadgama - Why is my web application slow?
Sudheer Reddy Battula - .NET HTML Sanitation for rich HTML Input
Rick Stralh - ASP.Net Web API and using Razor the next step
Fredrik Normén - Everything you want to know about ASP.NET Web API content negotation
Filip W.
Data access
- Entity Framework Magic Unicorn (and much more!) is now open source with take backs
Scott Hanselman - Entity Framework and Open Source
EF Team - So you want to contribute to EF? Part 1: Introduction
Arthur Vickers - Entity Framework y OSS
Unai Zorrilla - Entity Framework and Open Source
Scott Guthrie
Html/Css/Javascript
- jQuery Mobile Development Guide
Anthony James - 10 Best jQuery and HTML5 WYSIWYG Plugins
jQuery4u - Straightforward Dates In JavaScript
Oscar - How Do You Mark Up A Single Link or Button?
Louis Lazaris - Announcing jQuery Mobile 1.1.1
Todd Parker
Visual Studio/Complementos/Herramientas
- How Exactly ReSharper 7 Supports Visual Studio 2012
Hadi Hariri - Visual Studio 2012 RC Web Tooling Extensions update
Sayed Ibrahim Hashimi
Otros
- 7 Reasons Why I Can’t Do “Free”
Sharon Hayes - Windows 8 gets a date: 10/26
Todd Bishop - Un año después (¡felicidades, Juanma!)
Juan María Hernández
Publicado en Variable not found
DefaultDisplayMode
proporcionada por el framework, con la que podíamos cubrir la mayoría de necesidades comunes.Así, veíamos cómo el siguiente código era suficiente para registrar un nuevo Display Mode llamado “iPhone”, que sería activado cuando en el identificador del agente de usuario (encabezado user-agent de la petición) incluyera el texto “iPhone”:
DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("iPhone") { ContextCondition = (context => context.Request.UserAgent.IndexOf ("iPhone", StringComparison.OrdinalIgnoreCase) >= 0) });Hecho esto, ya podíamos definir vistas alternativas a las habituales específicas para este dispositivo, cuyos nombres de archivo acabarían siempre en “.iphone.cshtml”. Observad que estamos usando la clase
DefaultDisplayMode
, a la que estamos facilitando la condición que debe cumplirse para que se active este Display mode.Sin embargo, si pensamos crear muchas vistas específicas para dispositivos, podríamos encontrarnos con un maremagnum de archivos como el que veis en la captura de pantalla adjunta.
Obviamente, no es una situación fácilmente manejable, así que ¿por qué no cambiar la forma de nombrar los archivos dependiendo del Display Mode actual? Pues dicho y hecho, vamos a conseguir que cada dispositivo disponga de una carpeta específica para guardar sus vistas.
Heredando de DefaultDisplayMode
Si analizamos el código fuente de la clase DefaultDisplayMode
, veremos que hay varios miembros virtuales que podemos sobrescribir para tomar el control, y uno de ellos es el método TransformPath()
, encargado de transformar la ruta hacia el archivo físico donde está definida la vista teniendo en cuenta el nombre del Display Mode actual.El código por defecto del método es el siguiente:
protected virtual string TransformPath(string virtualPath, string suffix)
{
if (string.IsNullOrEmpty(suffix))
return virtualPath;
string extension = Path.GetExtension(virtualPath);
return Path.ChangeExtension(virtualPath, suffix + extension);
}
O sea, que se reemplaza la extensión del archivo, normalmente “.cshtml” por el resultado de concatenar el sufijo suministrado (el nombre del Display Mode) a dicha extensión. Por esta razón, el comportamiento por defecto del framework es utilizar construcciones como “nombrevista.iphone.cshtml”.Si, como es el caso, queremos cambiar la ruta donde van a intentar localizarse las vistas, lo único que tenemos que hacer es crear una clase descendiente de
DefaultDisplayMode
, sobrescribir la forma de “montar” la ruta hacia la vista, y utilizar esta nueva clase para registrar los modos de visualización que nos interesen. Una posible implementación podría ser la siguiente: public class OrganizedDisplayMode: DefaultDisplayMode
{
public OrganizedDisplayMode(string displayModeId): base(displayModeId)
{
}
protected override string TransformPath(string virtualPath, string suffix)
{
if (string.IsNullOrEmpty(suffix))
return virtualPath;
// Transforms /index.cshtml --> /suffix/index.cshtml
int lastSeparator = virtualPath.LastIndexOf('/');
virtualPath = virtualPath.Substring(0, lastSeparator) +
"/" + suffix +
virtualPath.Substring(lastSeparator);
return virtualPath;
}
}
Y en la inicialización de la aplicación ya podríamos registrar este Display Mode y asociarlo a la condición que esperamos que cumpla la petición: DisplayModeProvider.Instance.Modes.Insert(0,
new OrganizedDisplayMode("iPhone")
{
ContextCondition =
context => context.Request.UserAgent.Contains("iPhone")
});
De esta forma, ya podemos organizar las vistas como podéis observar en la captura de pantalla de la derecha: cada dispositivo (o Display Mode registrado) dispondría de una carpeta en cuyo interior se encontrarían las vistas específicas para el mismo.Y observad que su funcionamiento no se limita a las vistas asociadas a controladores concretos, la solución también sería válida en vistas compartidas (Shared) y con aquellas incluidas en áreas :-)
Publicado en Variable not found.
Publicado por José M. Aguilar a las 9:18 a. m.
Etiquetas: asp.net, aspnetmvc, desarrollo, novedades, trucos
.Net
- The Turkish İ Problem and Why You Should Care
Phil Haack - C# 5.0, Awaiting almost everything
Chris van Beek - TwitterAppender: de log4net a Twitter
Juan María Hernández - DotNetOpenAuth ships with Visual Studio 2012
Andrew Arnott - Advanced queries with Lucene.NET
Ricci Gian Maria - Generating Assemblies at runtime using IL emit
Pieter Van Parys
Asp.net
- Using SocialCounter.NET with ASP.NET MVC
Gunnar Peipman - FormsAuthentication on ASP.NET sites with the Google Chrome Browser on iOS
Scott Hanselman - Querying ASP.NET Web API with OData querying parameters
Lê Hoàng Dũng - Rolling your own ASP.Net MVC reCAPTCHA Helper
Pieter van der Westhuizen - Hackeando los validadores de ASP.NET
José Manuel Alarcón - A fully featured opensource ASP.NET MVC Forum
MVCForum - ASP.NET MVC: Encriptar la query string
Eduard Tomás - ASP.NET MVC: Edición de colecciones usando Ajax
Eduard Tomás - ASP.NET MVC 4: Where Have All The Global.asax Routes Gone?
Jon Davis - ASP.NET 4.0 Mejoras en el ScriptManager : ScriptResourceDefinition y AjaxFrameworkMode
Gonzalo Pérez
Azure / Cloud
Data access
- Entity Framework y el borrado de entidades (II) - usando lambda y árboles de expresión
Sergio Marrero - ORMs vs MicroORMs vs ADO.NET: Cuándo usar cada uno
Juan María Hernández - Carga de datos con NHibernate vs Dapper
Juan María Hernández
Html/Css/Javascript
- JavaScript String Methods Reference
Louis Lazaris - JSON no es JSON: JavaScript Object Literal
Gisela Torres
Visual Studio/Complementos/Herramientas
- Visual Studio 2012 Tip- Improve Productivity using Quick Launch
Kunal Chowdhury
Otros
Y no olvidéis que podéis seguir esta información en vivo y en directo desde Variable not found en Facebook, o a través de Twitter.Publicado en Variable not found
Ahí van unos cuantos.
.Net
- [IoC] Autoregistro de componentes con Autofac
Luis Ruiz Pavón - Thinking Linq
Chris Missal - New .NET Diagnostic info added to Process Explorer
Brandon Bray - Comparing Anonymous Objects in C# and VB
Peter Vogel - C#/.NET Little Wonders: The Joy of Anonymous Types
James Michael - Converting PDF to Text in C#
Dan Letecky - The System.Uri Class
Richard Carr
Asp.net
- Using Razor together with ASP.NET Web API
Fredrik Normén - SignalR 0.5.2 release notes
SignalR Team - ASP.NET MVC: Mandar un byte[]
Eduard Tomás - Using NLog to provide custom tracing for your ASP.NET Web API
Filip W. - ASP.NET MVC 4 Web API and HTTPResponseException
Sumit Dutta - IIS Best Practices
CenkIscan
Data access
- EF 5 y Table Value Functions
Unai Zorrilla - Desmitificando CodeFirst(1/2) y Desmitificando CodeFirst(2/2)
Pedro Hurtado - OpenAccess ORM - Another Free Tool in the Telerik’s Awesome Arsenal!
Telerik Team - Evolution of the Entity Framework: Lesson 3
K. Scott Allen - Don’t Use LINQ’s Join. Navigate!
Anders Abel - Basic Spatial Data with SQL Server and Entity Framework 5.0
Rick Strahl
Html/Css/Javascript
- jQuery Core: Version 1.9 and Beyond
Dave Methvin - NaN and typeof
Kiro Risk - Introduction To JavaScript Unit Testing
Jörn Zaefferer - HTML5 Canvas for the Noob–Part 1
Kevin Griffin - Safely Test a JavaScript Change Without Touching the Server–A Huge Time Sever
Ed Hintz - Detecting HTML5/CSS3 Features using Modernizr
Dan Wahlin - jQuery 1.8 Beta 1: See What’s Coming (and Going!)
Dave Methvin - Key Principles of Maintainable JavaScript
Jonathan Creamer
Visual Studio/Complementos/Herramientas
- Visual Studio 2012 New Features: Code Clone Analysis
Zain Naboulsi - NuGet 2.0 (.NET Package Manager) released - GO UPGRADE NOW and here's why
Scott Hanselman - Visual Studio 2012 New Features: Quick Launch
Zain Naboulsi
Windows 8
- Serie: Operaciones básicas de programación con Metro y Windows 8
Jorge Serrano
Otros
- Product Driven Guidance
Hadi Hariri - Java 8 lambdas
James Shaw
Publicado en Variable not found
Es para mí todo un honor y un privilegio seguir formando parte de este grupo de apasionados de las tecnologías Microsoft, gente increíble con la que da gusto tratar, y con los que espero poder compartir más buenos ratos.
Por si alguno no sabe de qué se trata, el galardón MVP (Most Valuable Professional) es un prestigioso reconocimiento que otorga Microsoft a personas de la comunidad técnica que dedican parte de su tiempo a compartir con otros usuarios sus conocimientos y experiencias sobre productos y tecnologías de esta compañía. Si estás interesado en saber más sobre ello, aquí puedes leer bastante sobre el reconocimiento MVP.
Muchas gracias a todos los que lo habéis hecho posible de nuevo :-)
Ah, y ¡felicidades a todos los nuevos galardonados, y a los que repiten también este año!
Publicado en Variable not found.
Por esta razón, desde el grupo de usuarios .NET de Sevilla, CartujaDotNet, se nos ha ocurrido que podríamos aprovechar el veranito que ya tenemos encima para organizar el primer Cartuja.Networking, un encuentro informal exclusivamente dedicado a desvirtualizar, conocer compañeros de fatigas, charlar distendidamente sobre tecnologías, lenguajes, sistemas operativos, herramientas, o lo que se nos ocurra.
Sin guión, ponentes ni protagonistas: la única intención es que nos conozcamos y le pongamos cara a la extensa comunidad de usuarios de tecnologías Microsoft de Sevilla, donde hay tanta gente interesante (¡interesantísima!), y con ganas enormes de compartir experiencias y conocimientos con los demás.
El día elegido para tan magno acontecimiento es el próximo miércoles 4 de julio, a las 20:00 de la tarde, en el QCross (zona Nervión). No hace falta registro ni nada parecido, simplemente presentarse allí y disfrutar de la compañía ;-)
¡¡No faltéis!!
Y si queréis estar al tanto de lo que se cuece en CartujaDotNet, noticias, eventos, o contactar con otros participantes, podéis uniros al grupo CartujaDotNet en Facebook, LinkedIn, o seguirlo a través de Twitter.
Más artículos hablando sobre este tema:
- CartujaDotNet despega!! Networking en Sevilla, por Fran Díaz.
- Cartuja .NET working, por Juan Laó.
- CartujaDotNet. Quedada en Sevilla, por Javier Suárez Ruiz.
El cartel oficial del evento es el siguiente:
SHAREPOINT PARA APLICACIONES EN ASP.NET DESDE CERO
¿Eres programador ASP.NET y no sabes nada acerca de SharePoint? No te preocupes, en AUGES hemos preparado este evento para que aprendas desde cero sobre está plataforma de Microsoft que está pegando muy fuerte y que ya usan millones de clientes en todo el mundo. Veremos las bases de la plataforma, los servicios, buenas practicas, el IDE de desarrollo… No puedes perdértelo!!!Ponente
Edin Kapic que es Key Consultant en Pasiona consulting, con más de 6 años de experiencia en Sharepoint, ponente en la European Sharepoint Conference de Berlín y miembro de Grupo de Usuarios de SharePoint de Cataluña – SUG.CAT.
Os recuerdo que se trata de un Webcast, o sea, que podéis asistir a este evento desde vuestro sillón favorito, acompañados de una buena cerveza y un saco de palomitas. Y por supuesto, es totalmente gratuito.
Lo único que debéis hacer para poder asistir es registraros:
- Día: miércoles 27 de junio de 2012, 19:00h (hora peninsular española)
- URL del registro: https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032514556&Culture=es-ES
Publicado en Variable not found.
.Net
- Node.js para programadores .NET
Sebastián Henzenn - Getting started with Lucene.NET–Searching
Ricci Gian Maria - TinyTwitter: Una micro librería para twittear desde C#
Juan María Hernández - Validar el formato de una imagen (no me mientas con el formato) con C#
Sergio Marrero (smarrerof) - The theory behind covariance and contravariance in C# 4
Tomas Petricek
Como siempre ocurre, nada es fruto del azar.
System.ComponentModel.DataAnnotations
:CreditCardAttribute
, que puede ser utilizado para validar números de tarjeta de crédito.EmailAddressAttribute
, que validará direcciones de correo electrónico.FileExtensionsAttribute
, para validar extensiones en nombres de archivo.PhoneAttribute
, que indica cuándo una propiedad debe contener un número de teléfono válido.UrlAttribute
, que comprobará si el contenido de una propiedad es una URL válida.CompareAttribute
, que antes estaba disponible en System.Web.Mvc y ha “ascendido” a anotación de datos general, permite validar la igualdad de dos propiedades.
También se ha incluido soporte para el atributo
MembershipPasswordAttribute
, recientemente incluido en System.Web.Security
, que comprueba si una contraseña cumple los requisitos establecidos para las mismas en el membership provider.Publicado en Variable not found.