[Spenta] Sí, somos Public Sector Government Partner of the Year

Pues ya puedo hacerlo oficial, hoy 24 de Junio de 2009 Spenta Consulting es Public Sector Government Partner of the Year, y aunque trabajo en dicha empresa, me siento orgulloso de que una empresa Española haya sido galardonada con este premio, fruto del reconocimiento al trabajo que viene realizando.

Public Sector, Government Partner of the Year

Spenta Consulting, Spain

Spenta Consulting developed an extended edition of the Microsoft Citizen Service Platform (CSP) to enable local and regional governments to deliver services effectively and efficiently in multiple channels. With this solution, citizens, civil servants, and politicians will have a better social interaction at a lower cost using the latest Microsoft technologies. The solution adds value with features such as multilanguage and accessibility support, a customizable look and feel, Web 2.0 capabilities, an extension toolkit, a tourism module, and Microsoft Surface applications to provide a new and better user experience. The CSP extended edition has had a major impact on communities, helping them to address a variety of challenges.

http://www.digitalwpc.com/Awards#Public-Sector-Government-Partner-of-the-Year

Enhorabuena a todo el equipo de Spenta!!!

[VSTO] System.AccessViolationException: Attempted to read or write protected memory

Problema:

vsto_logo_633135670333593750En una de las funcionalidades de un proyecto de VSTO Word en el que estoy echando una mano, me he encontrado el error que hace honor a este post:

System.AccessViolationException: Attempted to read or write protected memory

Concretamente cuando desde Word 2007 se quería abrir mas de un documento haciendo uso de la función:

Application.Documents.Open

Solución:

Mi manera de solucionarlo ha sido usar la siguiente fracción de código:

Marshal.ReleaseComObject(doc);
doc = null;

porque me dá que la función Close del Document no libera bien los recursos del documento y por eso se estaba produciendo el error y según la documentación este método se debe utilizar para liberar adecuadamente el objeto COM.

Salu2

[ASP.NET MVC] (Part II) Views

Definición

En el anterior post hablabamos sobre los controladores y en este toca hablar de las vistas, que no son ni más ni menos que nuestra carta de presentación frente al usuario y es lo primero que entra por los ojos y por eso debemos prestarlas mucha atención.

Cuando salieron los primeros bytes de ASP.MVC y actualmente, mucha gente al ver las etiquetas <% %> en las vistas:

<%
=Html.TextBox("username") 

%>

cree que ha vuelto el Spaghetti Code, os recomiendo leer este artículo:

http://blog.wekeroad.com/blog/asp-net-mvc-avoiding-tag-soup/

En el que precisamente se habla de como ASP.NET MVC se puede evitar todo esto, aunque por supuesto que con ASP.NET MVC, Ruby… se puede escribir Spaghetti Code, pero eso no es por la tecnología, sino por la calidad del programador.

Una de las cosas que tenemos que tener en bastante en cuenta es que la vista no de debe contener nada de lógica de negocio y que sólo debe ocuparse de la presentación de los datos del modelo.

A simple vista cuando creamos un proyecto de ASP.NET MVC podemos observar que existe una carpeta llamada Views:

views

y a parte, por cada controlador existe una carpeta que contiene vistas, que a su vez corresponden con los Action Methods del controlador:

public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
 
public ActionResult Register()
 
public ActionResult ChangePassword()

Aunque no todas las vistas tienen porque corresponder a un Action Method, por ejemplo ChangePasswordSuccess.aspx será una vista a la que se redirigirá desde el método Register cuando se cambie la password correctamente.

if (MembershipService.ChangePassword(User.Identity.Name, currentPassword, newPassword))
{
    return RedirectToAction("ChangePasswordSuccess");
}

 

 

 

 

Para crear una vista basta con pulsar botón derecho sobre el Action Method que queremos crear su vista:

views2

views3

Por defecto el nombre de la vista se corresponde con el del Action Method.

Tipos de Vistas

Podemos crear 3 tipos de vistas:

  1. Vista por defecto (aspx)
  2. Vista parcial (ascx)
  3. Vista fuertemente tipada, que nos permite seleccionar una entidad de nuestra solución sobre la se generará la vista y el template que queremos utilizar (Vacia (por defecto), Creación, Edición, Detalle y Listado)

La diferencia fundamental entre una vista fuertemente tipada y no está en la manera en la que accedemos al modelo de nuestra aplicación, que con una vista tipada es más claro y no tenemos que estar haciendo un cast del ViewData que retorna un object:

NO TIPADA

Directiva de página

Inherits="System.Web.Mvc.ViewPage"

Código

<% foreach (var item in (ViewData["Employee"] as IEnumerable<Employee>)) { %>

TIPADA

Directiva de página

Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcDemoApplication.Models.Employee>>

Código

 

 

<% foreach (var item in Model) { %>
Donde Model es del tipo TModel, es decir, en nuestro caso del tipo Employee
 
public class ViewPage<TModel> : ViewPage where TModel : class
{
    public ViewPage();
 
    public AjaxHelper<TModel> Ajax { get; set; }
    public HtmlHelper<TModel> Html { get; set; }
    public TModel Model { get; }
    public ViewDataDictionary<TModel> ViewData { get; set; }
 
    public override void InitHelpers();
    protected override void SetViewData(ViewDataDictionary viewData);
}

Dentro de la vista tenemos acceso a la clase Html, que es un helper que nos facilita un montón de métodos extensores para crear todo tipo de controles y atributos HTML. Además todos los métodos hacen uso de Encode para los datos que van a mostrar:

Html.ActionLink: Crear un hyperlink a otro Action Method

Html.TextBox: Crea un tag input con el atributo type establecido como text

Para ver todos los métodos de la clase Html: http://msdn.microsoft.com/en-us/library/system.web.mvc.html.aspx

ViewEngine

Otra cosa que podemos hacer en ASP.NET MVC es poder utilizar otro motor de vistas que no sea el propio de ASP.NET MVC, es decir podemos usar HHaml, NVelocity, Brail, Spark

En el siguiente ejemplo vamos a ver como podemos añadir el motor de vistas de HNaml a un proyecto ASP.NET MVC:

Lo primero es descargar NHaml –> http://code.google.com/p/nhaml/

A continuación creamos un nuevo proyecto:

views4

Una vez creado el proyecto, añadimos las siguientes referencias:

  • NHaml.dll
  • NHaml.Web.Mvc.dll
  • Microsoft.Web.Mvc.dll

A continuación, añadimos la siguiente línea de código a nuestro Global.asax:

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
 
    ViewEngines.Engines.Add(new NHaml.Web.Mvc.NHamlMvcViewEngine());
}

 

para enchufar el motor de vistas de NHaml. Hecho esto, vamos a añadir al Web.Config la siguiente configuración:

  1. Dentro del tag ConfigSections, añadimos una nueva sección para NHaml:
<section name="nhaml" type="NHaml.Configuration.NHamlConfigurationSection, NHaml"/>
  1. Fuera del tag Configuration, ya podemos definir nuestro tag nhaml:
<nhaml autoRecompile="true" templateCompiler="CSharp3" encodeHtml="false" useTabs="false" indentSize="2">
    <assemblies>
        <add assembly="NHamlMvcApplication"/>
    </assemblies>
    <namespaces>
        <add namespace="NHamlMvcApplication"/>
        <add namespace="NHamlMvcApplication.Controllers"/>
    </namespaces>
</nhaml>

El assembly es el nombre de nuestro proyecto y en el namespace también y añadimos también el de los controladores.

A continuación vamos a añadir nuestra MasterPage de NHaml, para ello:

  • Botón derecho sobre la carpeta Views/Shared y añadir un nuevo item:

views5

 

 

Ahora, vamos añadir marcado NHaml a nuestra página:

%html
%head
  %title = "Demo NHaml"
  %link{ href="../../Content/Site.css" rel="stylesheet" type="text/css" }
%body
  %div.page

 

Pudes ver la referencia de marcado en NHaml aquí –> http://andrewpeters.net/2007/12/19/introducing-nhaml-an-aspnet-mvc-view-engine/

A continuación, vamos a crear nuestro de modelo de datos, que en esta caso será algo sencillo y nos basaremos en el patrón Repositorio:

Entidad

public class User
{
    public int Id
    {
        get;
 
        set;
    }
 
    public string Name
    {
        get;
 
        set;
    }
 
    public int Age
    {
        get;
 
        set;
    }
}

Interfaz

interface IUsersRepository
{
    List<User> GetUsers();
}
 
Implementación

 

public class TestUserRepository : IUsersRepository
{
    #region IUsersRepository Members
 
    public List<User> GetUsers()
    {
        List<User> users = new List<User>{
            new User(){ Id = 1, Name = "Tom", Age = 20},
            new User(){ Id = 2, Name = "Tom 2", Age = 21},
            new User(){ Id = 3, Name = "Tom 3", Age = 22}
        };
 
        return users;
    }
 
    #endregion
}

 

Añadimos un nuevo controlador al que denominaremos UserController:

public class UserController : Controller
{
    public ActionResult Index()
    {
        TestUserRepository repository = new TestUserRepository();
 
        var users = repository.GetUsers();
 
        return View("List", users);
    }
 
}

 

Y por último vamos a crear nuestra vista a la que llamaremos List.haml dentro de la carpeta Views/User:

views6

Y la añadimos el siguiente código para mostrar un listado de los nombres de los usuarios:

%h2= "List of Users"
%ul
  - foreach (var user in Model)
      %li
        = user.Name

 

Y ya solo queda probarlo:

views7

Bueno, pues hasta aquí las vistas, espero que os haya resultado interesante y en la siguiente veremos como que son los Filters

Salu2

[StyleCop] Habilitar/Deshabilitar reglas en nuestros desarrollos

Una de las caracterisitcas que StyleCop nos provee es que podemos habilitar/deshabilitar las reglas que no creemos oportunas en nuestros desarrollos, por ejemplo, en mi caso vamos a deshabilitar 2 reglas:

SA1632: The documentation text within the param tag must be at least 10 characters in length. Documentation failing to meet this guideline most likely does not follow a proper grammatical structure required for documentation text.

SA1630: The documentation text within the summary tag does not contain any whitespace between words, indicating that it most likely does not follow a proper grammatical structure required for documentation text.

La primera saltará cuando la longitud del parámetro es menor de 10 caracteres. Cuando utilizas GhostDoc y comentas por ejemplo un constructor salta por que algunos parámetros los toma literalmente del nombre del parámetro, como en el caso de suit:

/// <summary>
 /// Initializes a new instance of the <see cref="Card"/> class.
 /// </summary>
 /// <param name="suit">The suit.</param>
 /// <param name="faceVal">The face val.</param>
 /// <param name="isCardUp">if set to <c>true</c> [is card up].</param>
 public Card(Suit suit, FaceValue faceVal, bool isCardUp)
 {
     this.suit = suit;
     this.faceVal = faceVal;
     this.isCardUp = isCardUp;
 }

La segunda saltará cuando el tag summary no tiene espacios entre palabras, pero sí por ejemplo, con una sola palabra queda claro como en este caso es el tipo de jugador:

namespace Blackjinet.Entities.Enums
{
    /// <summary>
    /// Player's Type
    /// </summary>
    public enum PlayerType
    {
        /// <summary>
        /// Dealer
        /// </summary>
        Dealer,
 
        /// <summary>
        /// Player
        /// </summary>
        Player
    }
}

Bueno pues vamos a ver como deshabilitamos estas reglas y tenemos 2 opciones (sí alguien sabe alguna más, bienvenida será):

  • A nivel de Solución

En la ruta de la imagen (C:Program FilesMicrosoft StyleCop 4.3.1.3), tenemos un archivo Settings donde se almacenan las reglas de StyleCop

image

Sí lo ejecutamos podemos ver la reglas organizadas por categorías:

image

Para aplicar las reglas a nivel de solución, copiamos este archivo en el directorio donde se encuentra nuestra solución (.sln)

image

Lo abrimos, deshabilitamos las reglas y pulsamos OK:

 image

Con esto dehabilitamos esas 2 reglas para toda la solución.

  • A nivel de Proyecto

Para deshabilitar reglas a nivel de proyecto, lo podemos hacer a través del Visual Studio:

Seleccionando el proyecto –> Botón derecho –> StyleCop Settings

image 

Eso sí, la modificación de estas reglas solo aplican para el proyecto que estamos modificando.

Salu2