Implementación de un sistema de clasificación de estrellas con DotVVM y CSS
Tags: webdev, css, csharp, dotnet
Published: 2020-02-24 21:56:31

En la actualidad son muchas las páginas web y tiendas en línea que poseen sistemas de evaluación y elementos de interacción para que los visitantes y clientes puedan realizar una calificación sobre productos, servicios o empresas mediante reseñas (reviews), normalmente en la escala del 1 al 5.

El estilo de clasificación que la mayoría de las páginas web y aplicaciones utiliza es la Clasificación por Estrellas. 

En este blog aprenderemos paso a paso como implementar un sistema de estrellas simple con DotVVM - ASP.NET Core y CSS.

##Página web DotVVM##

####Viewmodel####

En el Viewmodel vamos a definir dos atributos para nuestra pagina web: 

```csharp
public string Title { get; set;}
public string Rating { get; set; }
```

`Title` para el título de la página y `Rating` para almacenar en este atributo el valor seleccionado por el usuario en el sistema de clasificación por estrellas. Asimismo, en esta variable podemos poner por defecto el valor predefinido que tendrá el sistema, en este caso será el valor de 1. Para aplicaciones futuras, por ejemplo, si se desea recuperar la calificación realizada por un usuario determinado de la base de datos, el valor deberá ser asignado a este atributo `Rating`.

####View####

En la vista de la página, para el sistema de clasificación, se empleará el control [DotVVM RadioButton](https://www.dotvvm.com/docs/controls/builtin/RadioButton/latest) para cada uno de los elementos de clasificación, en este caso, son 5 en total. 

```html
<dot:RadioButton id="star5" CheckedItem="{value: Rating}" CheckedValue="5" />
<label for="star5" title="5 Stars">5</label>

<dot:RadioButton id="star4" CheckedItem="{value: Rating}" CheckedValue="4" />
<label for="star4" title="4 Stars">4</label>

<dot:RadioButton id="star3" CheckedItem="{value: Rating}" CheckedValue="3" />
<label for="star3" title="3 Stars">3</label>

<dot:RadioButton id="star2" CheckedItem="{value: Rating}" CheckedValue="2" />
<label for="star2" title="2 Stars">2</label>

<dot:RadioButton id="star1" CheckedItem="{value: Rating}" CheckedValue="1" />
<label for="star1" title="1 Stars">1</label>
```

De forma adicional, también se agrega un label a cada uno de los componentes del `RadioButton` a través de su `Id`. Hasta el momento, tenemos algo como esto:

![](https://thepracticaldev.s3.amazonaws.com/i/66cx2swtbyh23jn74vqv.png)

##Estilos CSS##

Hasta el momento ya tenemos nuestro sistema de clasificación, pero nos falta agregarle vida a la página, sobre todo a la sección de puntuación, para ello agregaremos una fuente de estilos para cumplir con estos objetivos. 

En la actualidad, existe una gran variedad de bibliotecas que nos proporcionan una fuente de estilos e iconos para nuestras aplicaciones.  Para nuestro caso haremos uso de Font Awesome, para emplear iconos en forma de estrella para reemplazar el icono circular tradicional del RadioButton. La fuente de estilos la podemos encontrar en: 

[http://netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css](http://netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css).

Con la implementación de estos estilos, lograremos los siguientes objetivos: 

+ Quitar botones de radio (las formas circulares).
+ Asignar iconos en forma de estrella en cada uno de los DotVVM RadioButton.
+ Establecer un color negro inicial para las estrellas no seleccionadas. 
+ Establecer un color amarillo cuando la estrella es marcada. 
+ Establecer un color amarillo cuando la estrella pasa el ratón. 

Un aspecto muy importante por mencionar es que si bien es cierto en la pagina web estamos hablando de controles DotVVM, estos a la final serán traducidos en etiquetas HTML que permitirán aplicar estilos y propiedades sobre estas etiquetas HTML. Por ejemplo: 

**Código DotVVM:**

```csharp
<dot:RadioButton id="star5" CheckedItem="{value: Rating}" CheckedValue="5" />
```

**Código HTML:**

```html
<input id="star5" type="radio" name="ko_unique_1" data-bind="checked: Rating, checkedValue: '5', attr: {}" value="5">
```

Nuestro resultado será el siguiente: 

![](https://thepracticaldev.s3.amazonaws.com/i/ne1tp31igx3e4tb4npkh.png)

##Código fuente##

*`DefaultViewModel.cs`*

```csharp
namespace StarRating.ViewModels
{
    public class DefaultViewModel : MasterPageViewModel
    {
	public string Title { get; set;}
        public string Rating { get; set; }

        public DefaultViewModel()
	{
	    Title = "DotVVM Star Rating";
            Rating = "1";
	}
    }
}
```

*`Default.dothtml`*

```csharp
@viewModel StarRating.ViewModels.DefaultViewModel, StarRating
@masterPage Views/MasterPage.dotmaster
<dot:Content ContentPlaceHolderID="MainContent">

    <h1><b>{{value: Title}}</b></h1>

    <div class="starrating risingstar d-flex-star justify-content-center-star flex-row-reverse-star">
        <dot:RadioButton id="star5" CheckedItem="{value: Rating}" CheckedValue="5" />
        <label for="star5" title="5 Stars">5</label>

        <dot:RadioButton id="star4" CheckedItem="{value: Rating}" CheckedValue="4" />
        <label for="star4" title="4 Stars">4</label>

        <dot:RadioButton id="star3" CheckedItem="{value: Rating}" CheckedValue="3" />
        <label for="star3" title="3 Stars">3</label>

        <dot:RadioButton id="star2" CheckedItem="{value: Rating}" CheckedValue="2" />
        <label for="star2" title="2 Stars">2</label>

        <dot:RadioButton id="star1" CheckedItem="{value: Rating}" CheckedValue="1" />
        <label for="star1" title="1 Stars">1</label>
    </div>

    <br />
    <b>Selected rating: <font size="6" color="#004C88"> {{value: Rating}} </font> </b>

</dot:Content>
```

`MasterPage.dotmaster`

```html
@viewModel StarRating.ViewModels.MasterPageViewModel, StarRating
<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>DotVVM Star rating</title>
    
    <style>
        @import url(//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css);

        .flex-row-reverse-star {
            -webkit-box-orient: horizontal !important;
            -webkit-box-direction: reverse !important;
            -webkit-flex-direction: row-reverse !important;
            -ms-flex-direction: row-reverse !important;
            flex-direction: row-reverse !important
        }

        .justify-content-center-star {
            -webkit-box-pack: center !important;
            -webkit-justify-content: center !important;
            -ms-flex-pack: center !important;
            justify-content: center !important
        }

        .d-flex-star {
            display: -webkit-box !important;
            display: -webkit-flex !important;
            display: -ms-flexbox !important;
            display: flex !important
        }

        .starrating > input {
            display: none;
        }
        /* Remove radio buttons */

        .starrating > label:before {
            content: "\f005"; /* Star */
            margin: 2px;
            font-size: 8em;
            font-family: FontAwesome;
            display: inline-block;
        }

        .starrating > label {
            color: #222222; /* Start color when not clicked */
        }

        .starrating > input:checked ~ label {
            color: #ffca08;
        }
        /* Set yellow color when star checked */

        .starrating > input:hover ~ label {
            color: #ffca08;
        }
        /* Set yellow color when star hover */

    </style>



</head>
<body>
	<dot:ContentPlaceHolder ID="MainContent" />
</body>
</html>

```

##Próximos pasos…##

Con estas instrucciones hemos aprendido a crear un sistema de clasificación del 1 al 5 a través de estrellas con DotVVM y estilos CSS. 

El código fuente de esta implementación se lo puede encontrar en este repositorio: [DotVVM Star Rating](https://github.com/esdanielgomez/DotVVMStarRating).

####Recursos adicionales#####

¿Deseas saber cuáles son los pasos para crear una aplicación DotVVM? Para ello puedes revisar este articulo: [Pasos para crear una aplicación MVVM (Model-View-Viewmodel) con DotVVM y ASP.NET Core.](https://dev.to/esdanielgomez/steps-to-create-an-mvvm-application-model-view-view-model-with-dotvvm-and-asp-net-core-fm2)

¿Quieres dar tus primeros pasos en el desarrollo de aplicaciones web con ASP.NET Core y DotVVM? Aprende más en este tutorial: [DotVVM y ASP.NET Core: Implementación de operaciones CRUD](https://dev.to/esdanielgomez/dotvvm-y-asp-net-core-implementacion-de-operaciones-crud-43oe).

¡Gracias!
Nos vemos en [Twitter](https://twitter.com/esDanielGomez)!! :)