none
Primer proyecto en MVC5 - dudas iniciales básicas RRS feed

  • Pregunta

  • Buenas como indica el título estoy realizando un proyecto con MVC5 a modo de prueba y les preguntaré un par de dudas que me han aparecido después de leer un par de libros sobre el tema , ver varios videotutoriales en youtube y ahora me pongo al "lio".

    El proposito es hacer una web con ASP.NET MVC5 para la gestión de clientes y sus ventas , para ello con VS2013 y el framework 4.5.1 he creado un proyecto nuevo asp.net con MVC y la idea es crear las tablas de la BD de sql server a partir de un modelo hecho con Entity framework.

    1º Duda : Voy a tener una tabla de cabeceras de venta donde almacenaré a quien va dirigida la venta y el total de ella misma , y después otra tabla que se dirá VentasLinias.

    Las claves principales serán para la tabla Venta id y tienda ya que tendré este escenario

    id : 1

    tienda : 1

    o bien

    id : 1

    tienda :2

    Para ello he creado esta asociación en el modelo , donde le digo que 1 venta puede tener N VentasLinia , no se si esta relación esta bien hecha o bien debe ser campo a campo  , tengo esta duda.

    Duda 2 : pongamos el caso que en el modelo Cliente me falta añadir un campo que es "tarjeta de crédito" y resulta que he creado el modelo y me ha creado los formularios CRUD , si añado este campo en el modelo me lo hará de forma recursiva a las plantillas de razor o tengo que hacerlo con alguna opción desde algún menú?

    Duda 3 : tengo la intención que el site sea multilenguaje , para coger buenas practicas como me recomendáis que ponga las etiquetas de texto en los archivos para que luego pueda ser fácilmente traducible .


    Gracias,

    viernes, 23 de diciembre de 2016 8:48

Todas las respuestas

  • Sobre el 1: Sí, está bien hecha la relación, es decir, en el VentasLinea se pone un FK que apunte al Id de Ventas y eso conecta las dos tablas. Lo que no está demasiado bien es lo que has dicho en el texto (pero no está en el diagrama) en el sentido de que la cabecera tiene el total de la venta. Para que la base de datos esté bien normalizada, ese total no debería estar ahí, sino que solo debería existir el importe de cada línea de venta en la tabla LineasVenta, y el total de la venta debería inferirse dinámicamente sumando las líneas.

    Sobre el 2: No, si cambias el modelo, el cambio no se propaga a las plantillas Razor. Y es razonable que no se propague porque normalmente esas plantillas solo se toman como punto de partida, pero luego se modifican manualmente de manera que las plantillas que realmente usas en la aplicación terminada guardan muy poco parecido a las originales. En consecuencia, sería casi imposible hacer un automatismo que tenga la inteligencia necesaria para saber cómo modificar esas plantillas personalizadas a partir de un cambio en el Modelo. Así que los cambios tendrás que agregarlos manualmente. Por supuesto, si no has cambiado nada en las plantillas, lo que sí que puedes hacer es borrarlas y volverlas a generar de nuevo, en cuyo caso sí que tomarán los cambios desde el modelo.

    Sobre el 3: Para multilenguaje hay dos formas distintas de trabajar. Una es hacer una vista Razor distinta para cada idioma, y luego modificar la carga de plantillas para que cargue la plantilla correspondiente al idioma seleccionado. El código necesario para ello es fácil de encontrar si buscas en Internet. Sin embargo, el problema de este método es el mantenimiento, porque cada vez que modificas algo en una plantilla hay que buscar todas sus traducciones y hacer el cambio en ellas.

    La otra forma de hacer las traducciones consiste en no escribir directamente el texto en la plantilla sino recuperarlo de los recursos con un comando tal como @MiRecurso.MiTexto. Después se añade en el proyecto el archivo MiRecurso.resx y se declara dentro el contenido de MiTexto. Si después traduces el .resx generando el .idioma.resx, el sistema lo entiende automáticamente y saca MiTexto del archivo que corresponda al idioma actual. Nota: Esta es una visión muy simplificada, lógicamente tendrás múltiples .resx organizados por carpetas y al llamarlos tendrás que introducir el Namespace corespondiente. Acuérdate de que en el .resx hay que seleccionar visibilidad "public" (por defecto son "internal"), sino la vista Razor no es capaz de acceder a ellos.

    viernes, 23 de diciembre de 2016 9:08
  • Sobre el 1: Sí, está bien hecha la relación, es decir, en el VentasLinea se pone un FK que apunte al Id de Ventas y eso conecta las dos tablas. Lo que no está demasiado bien es lo que has dicho en el texto (pero no está en el diagrama) en el sentido de que la cabecera tiene el total de la venta. Para que la base de datos esté bien normalizada, ese total no debería estar ahí, sino que solo debería existir el importe de cada línea de venta en la tabla LineasVenta, y el total de la venta debería inferirse dinámicamente sumando las líneas.

    Sobre el 2: No, si cambias el modelo, el cambio no se propaga a las plantillas Razor. Y es razonable que no se propague porque normalmente esas plantillas solo se toman como punto de partida, pero luego se modifican manualmente de manera que las plantillas que realmente usas en la aplicación terminada guardan muy poco parecido a las originales. En consecuencia, sería casi imposible hacer un automatismo que tenga la inteligencia necesaria para saber cómo modificar esas plantillas personalizadas a partir de un cambio en el Modelo. Así que los cambios tendrás que agregarlos manualmente. Por supuesto, si no has cambiado nada en las plantillas, lo que sí que puedes hacer es borrarlas y volverlas a generar de nuevo, en cuyo caso sí que tomarán los cambios desde el modelo.

    Sobre el 3: Para multilenguaje hay dos formas distintas de trabajar. Una es hacer una vista Razor distinta para cada idioma, y luego modificar la carga de plantillas para que cargue la plantilla correspondiente al idioma seleccionado. El código necesario para ello es fácil de encontrar si buscas en Internet. Sin embargo, el problema de este método es el mantenimiento, porque cada vez que modificas algo en una plantilla hay que buscar todas sus traducciones y hacer el cambio en ellas.

    La otra forma de hacer las traducciones consiste en no escribir directamente el texto en la plantilla sino recuperarlo de los recursos con un comando tal como @MiRecurso.MiTexto. Después se añade en el proyecto el archivo MiRecurso.resx y se declara dentro el contenido de MiTexto. Si después traduces el .resx generando el .idioma.resx, el sistema lo entiende automáticamente y saca MiTexto del archivo que corresponda al idioma actual. Nota: Esta es una visión muy simplificada, lógicamente tendrás múltiples .resx organizados por carpetas y al llamarlos tendrás que introducir el Namespace corespondiente. Acuérdate de que en el .resx hay que seleccionar visibilidad "public" (por defecto son "internal"), sino la vista Razor no es capaz de acceder a ellos.

    Gracias sobre el punto 3 del multilenguaje no me interesa distintas vistas por lo tanto voy a usar el comando en cada plantilla.

    Este archivo de traducción para tener buenas practicas lo pongo dentro de la carpeta "Content" o donde debería ir?

    Luego en cada plantilla de razor tengo que llamarlo? La idea es hacerlo de alguna forma dinámica y dependiendo de algún tipo de configuración del usuario seleccionar "español" o "inglés" no?

    Gracias,

    viernes, 23 de diciembre de 2016 9:41
  • Este archivo de traducción para tener buenas practicas lo pongo dentro de la carpeta "Content" o donde debería ir?

    No, en Content no debería ir. Esa carpeta es para contenidos que se sirven a las páginas. Los archivos de recursos no se envían al navegador, sino que quedan compilados dentro de una dll. Y luego cuando llamas a @recurso.nombre, se ejecuta esa instrucción y saca el string de la dll. Por tanto, los archivos de recursos deben estar en una carpeta de código, no en la Content.

    Luego en cada plantilla de razor tengo que llamarlo? La idea es hacerlo de alguna forma dinámica y dependiendo de algún tipo de configuración del usuario seleccionar "español" o "inglés" no?

    En cada plantilla Razor solo tienes que llamar a @espaciodenombres.recurso.nombre en donde quieras escribir el texto que se archivó como "nombre" en el archivo "recurso". Si lo ubicaste en una subcarpeta, de manera predeterminada el nombre de la subcarpeta se agregará al espaciodenombres.

    El idioma se toma automáticamente del CurrentUICultue que esté configurado. Por ejemplo, si el currentuiculture es "es-CL" (español de Chile) y existe un  archivo "recurso.es-CL.resx", se toman de ahí las traducciones. Si no existe, se toman de recurso.es.resx. Y si tampoco existe, se toman de recurso.resx.

    ¿Y de dónde sale el idioma del currentUIculture? Lo más sencillo es poner en el web.config <uiculture mode="auto" />. Esto hace que se cargue a partir del idioma que viene en las cabeceras http enviadas por el navegador. Pero también lo puedes cambiar por programación modificando el Thread.CurrentThread.CurrentUICulture.

    viernes, 23 de diciembre de 2016 18:26