Quitar validación de datos inseguros en MVC

sc4

Este error es consecuencia de que ciertas veces necesitamos mandar texto no seguro (HTML, XML) al server y MVC 4 lo bloque por defecto.

Yo en particular implemente 2 soluciones para este problema:

  • El hecho es que si el nombre del campo del formulario comienza por dos caracteres de subrayado, por ejemplo, “__Texto”, no se efectúan sobre él las comprobaciones de validación.
  • Para deshabilitar la validación de la solicitud de un método de acción, marcar el método con el atributo ValidateInput (False), como se muestra en el siguiente ejemplo:

Captura

 


Armado de query para Explorer web y mobile

Para darle soporte a los diferentes formatos de vistas que soporta el componente UI.Explorer (listado, mapa, calendario y galería) las vistas destinadas al mismo deberán contar con las siguientes columnas básicas (Ejemplo: Co_MK_VW_Eventos):

  • _state
  • _state_code
  • _state_color
  • _state_text
  • _tags
  • _crm_account_id
  • _attachments (*)
  • _notes (*)
  • _geo_latitude
  • _geo_longitude
  • _calendar_id (no se muestra)
  • _calendar_date (a)
  • _calendar_title (b)
  • _calendar_body (c)
  • _gallery_id (no se muestra)
  • _gallery_picture (1)
  • _gallery_picture_placeholder (2)
  • _gallery_price_label (3)
  • _gallery_category (4)
  • _gallery_title (5)
  • _gallery_item_description (6)
  • _gallery_link_text (7)

(*) Éstas columnas, por cuestiones de performance, deberían salir de la tabla de propiedades de la entidad.

Las columnas que comienzan con el prefijo “_calendar_” se utilizarán en el formato “Calendario” de la siguiente manera:

vistacalendario

Las columnas que comienzan con el prefijo “_gallery_” se utilizarán en el formato “Galería” de la siguiente manera:

 


Agregar columnas a un grilla

–Debo agregar una columna a la grilla.
— verifico que exista el campo en :
USE INFORMAC_DESARROLLO

SELECT * FROM Codigos_Seg_Columnas_Sistema
–si no existe lo agrego
INSERT INTO Codigos_Seg_Columnas_Sistema
([datafield],[text],[type],[width],[cellsalign],[cellsformat]) VALUES (‘TipoPublicacion’,’TipoPublicacion’,’number’,’80px’,’right’,’NULL’)

–verifico si la vista trae el campo
SELECT * FROM Codigos_Seg_Vistas_Columnas_Def
WHERE ViewId=’MELI-1′

–si no existe lo agrego
INSERT INTO Codigos_Seg_Vistas_Columnas_Def
([ViewId], [datafield], [editable], [hidden],[order]) VALUES (‘MELI-1′,’TipoPublicacion’,0,0,11)

–actualizo un campo para hacerlo editable en la grilla
update Codigos_Seg_Vistas_Columnas_Def
set editable =1
where [ViewId] =’MELI-1′ and datafield =’PrecioPublicado’
–actualizo un campo para hacerlo editable en la grilla


Remover CSS sin utilizar en HTML

Hay varias formas de detectar que estilos no se están utilizando en un HTML. Las mas recomendables son:

1)Utilizar Audits en el inspector de chrome:

imagen1

 

2) Descargar del GooglePlay la  app CSS Remove and Combine, que te permite descargar un block de notas solo con los CSS que están siendo utilizados, discriminando a los que no:

image2


Configuración – Rango Por Intervalos

1- Se crea rango en Codigos_DefinicionesRangos_Net de acuerdo a los siguientes campos
CLAVE INTERVAL_VENDEDORES
TITULO Intervalo de Vendedores
TITULOETIQUETADD Incluir
TITULOETIQUETAHH Incluir
TIPO_DATO 8
VALORDD
VALORHH
TABLA null
VISTA GR-7
CODIGO CoDescriptivo
DESCRIPCION Descripcion
DDFORMULACRYSTAL INT_Vendedores
HHFORMULACRYSTAL INT_Vendedores
MAXLEN 6
SELECTDATA NULL

2-Se altera el store procedure de acuerdo al siguiente ejemplo, agregando lo que esta en negrita
 —
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[Co_VT_SP_Vt_Facturas_Cabezal]
 —
@DDCoCliente int = 0,
@HHCoCliente int = 999999,
@DDFecha datetime = null,
@HHFecha datetime = null,
@DDNoComprobante INT = 0,
@HHNoComprobante INT = 999999,
@DDCoVendedor int = 0,
@HHCoVendedor int = 999999,
@INT_Vendedores IntInterval readonly as
 —
 if (@DDFecha is null) select @DDFecha = convert(datetime,’01/01/’ + convert(varchar(4),year(getdate())))
if (@HHFecha is null) select @HHFecha = getdate()
if (select count(*) from @INT_Vendedores) > 0    
 —
Begin
 —
SELECT NoComprobante,
FechaComprobante,
CoCliente,
Cliente,
CoVendedor,
Vendedor,
CotizacionDolar,
CoComprobante,
LetraLugarNumero,
GeneradoHide,
_tags,
_state
FROM dbo.Co_VT_FX_Vt_Facturas_Cabezal(@DDCoCliente, @HHCoCliente, @DDFecha, @HHFecha, @DDNoComprobante, @HHNoComprobante, @DDCoVendedor, @HHCoVendedor) fVTFC
where fVTFC.CoVendedor in (select * from @INT_Vendedores)  
ORDER BY fVTFC.NoComprobante desc
Return
End
 —
SELECT NoComprobante,
FechaComprobante,
CoCliente,
Cliente,
CoVendedor,
Vendedor,
CotizacionDolar,
CoComprobante,
LetraLugarNumero,
GeneradoHide,
_tags,
_state
FROM dbo.Co_VT_FX_Vt_Facturas_Cabezal(@DDCoCliente, @HHCoCliente, @DDFecha, @HHFecha, @DDNoComprobante, @HHNoComprobante, @DDCoVendedor, @HHCoVendedor) fVTFC
ORDER BY fVTFC.NoComprobante desc
 —

3-Se carga el rango relacionado a la vista en Codigos_Seg_Vistas_Rangos
Modulo COMP
Id 20
ClaveRango INTERVAL_VENDEDORES
Orden 90

 


 

4- Como final de este tema se puede configurar la seguridad del Usuario (por medio del grupo) cargándole predefinido los valores a saber en la siguiente tabla, Info_DefinicionesRangosNetGruposDefault:

RANGO VISTA_ID CLAVERANGO GRUPO_USUARIO VALORDD VALORHH VISIBLE READONLY
1 GR-68 CLIENTES ASISTENCIA 1 99999 True False
1 COMP-20 LIKE_VENDEDORES PAT 18 18 True True
1 COMP-20 LIKE_VENDEDORES CUYO 12 12 True True
1 52100 LIKE_VENDEDORES PAT 18 18 True True
1 52100 LIKE_VENDEDORES CUYO 12 12 True True
1 COMP-20 INTERVAL_VENDEDORES CBA [17,37,38,39,49,53] [17,37,38,39,49,53] False True
1 52100 INTERVAL_VENDEDORES CBA [17,37,38,39,49,53] [17,37,38,39,49,53] True True
1 DD-99 LIKE_VENDEDORES PAT 18 18 True True
1 DD-99 LIKE_VENDEDORES CUYO 12 12 True True
1 DD-99 INTERVAL_VENDEDORES CBA [17,37,38,39,49,53] [17,37,38,39,49,53] True True

Envio de mails a demanda

Para generar el envío de mails a demanda, es necesario agregar una columna extra que contenga el NoInterno de dicha cuenta. La misma estará oculta al momento de dibujar la grilla.

Hecho esto se deben cargar los siguientes datos:

id plantilla : El ID de la plantilla a cargar

tabla de la entidad de la grilla (Primary Key)

SP de los datos a utilizar en el mail (parametros=pk de la tabla) tiene el origen de datos del mail

columna para el texto de plantilla del mail

Para ver ejemplo, revisar la entidad MK_EVENTOS

 

 


Configurar – Grilla Calendario

Configuración – Correlación de campos para armar la grilla “Calendario”

zz_Calendario-Barra

Para que en una grilla se pueda mostrar el tipo “Calendario” se debe… agregar un store procedure con una salida determinada (a).

El siguiente ejemplo usa como base el store procedure “Mk_Eventos_Calendar”

Este store recibe como parámetros:

  1. @DDFecha datetime = null
  2. @HHFecha datetime = null
  3. @DDNoEvento int = 0
  4. @HHNoEvento int = 999999
  5. @DDNoInterno int = 0
  6. @HHNoInterno int = 999999
  7. @DDCoAccion int = 0
  8. @HHCoAccion int = 9999999
  9. @INT_NoInterno IntInterval readonly

y devuelve los siguientes campos (a):

(1) id (no mostrado).
(2) start (fecha)
(3) end (fecha)
(4)  title
(5) body
(6) allDay
(7) multi
(8) extension_id

En el controlador de la vista que necesitamos agregamos:

function EventosCtrl($scope, $window, $modal, _, StorageService, RequestService) {
BaseGridCtrl.call(this, $scope, $window, $modal, _, RequestService, “Mk_Eventos”, “MK-33”);

$scope.keys = [‘NoEvento’];
$scope.mapViewId = ‘GEO-6’;
$scope.calendarViewId = ‘CAL-###’;
$scope.galleryViewId = ‘GAL-1’;

 


Configuración – Ayuda del formulario

¿Cómo Agregar una página web de ayuda para un formulario?

 

zz_BotonAyudaFormulario

Al hacer click en el botón se abre una nueva solapa del navegador y muestra la ayuda asociada, si la tuviese.

Para mostrar una página web de ayuda asociada a un formulario se debe insertar un registro en la tabla:

INFORMAC_xxxxx..Codigos_Ayuda_Formularios

Por ejemplo:

INSERT INTO [INFORMAC_DESARROLLO].[dbo].[Codigos_Ayuda_Formularios]
(Ayuda_Id , URL_Form , URL_KB )
VALUES
(1000,’/Crm/Cuenta’,’http://kb.igglobal.baseglobal.com.ar/2015/09/eventos/’)
GO

Campos de la tabla

Ayuda_Id         : Identificador único de la ayuda
URL_Form      : URL del formulario origen, del que se necesita la ayuda.
URL_KB          : URL de la página que tiene la ayuda solicitada, generalmente del wordpress,

 


Armado de grillas simples

El armado de una grilla en IGGLOBAL Online consta de los siguientes pasos (partiendo del hecho que existe controlador MVC para dicha grilla):

  1. Sobre el proyecto IGGlobal.Mvc -> Buscar la carpeta “Controllers” -> Abrir el archivo de controlador MVC requerido, por ejemplo CrmController.
  2. Agregar el método de controlador al que hace referencia la grilla. Ejemplo: Ver Archivo Views/Cargos.vbhtml
  3. Sobre la carpeta Scripts -> app -> controllers -> botón derecho -> agregar archivo JavasScript. Dentro de éste archivo se colocará el controlador de AngularJs. El nombre del archivo deberá estar conformado por el concepto de la grilla y el sufijo “Ctrl”. Ejemplo: CargosCtrl.js.
  4. A continuación se muestra un ejemplo de controlador AngularJS (los parámetros “Mk_Cargos” y “MK-1” representan el nombre de la entidad y el ID de acción para cargar la grilla de datos respectivamente):
    function CargosCtrl($scope, $window, $modal, _, StorageService, RequestService, UtilsService) {
        //Llamado a controlador "padre"
        BaseGridCtrl.call(this, $scope, $window, $modal, _, RequestService, "Mk_Cargos", "MK-1");
    
        //Definición de clave primaria
        $scope.keys = ['CoCargo'];
    
        //Acción para creación de nuevo registro
        $scope.create = function () {
            var cns = StorageService.fromSession("empresa");
            $window.location.href = '/Crm/Cargo?_connectionStringId=' + cns;
        }
    
        //Acción para edición de un registro
        $scope.edit = function () {
            var cns = StorageService.fromSession("empresa");
            keys = $scope.getSelectedKeys();
            $window.location.href = '/Crm/Cargo?CoCargo=' + keys.CoCargo + '&_connectionStringId=' + cns;
        }
        
        //Definición de acciones extra
        /*
        $scope.actions = [
           {
               id: '1',
               text: 'Agregar',
               icon: 'fa fa-plus-circle',
               multiselect: false,
               singleselect: false,
               onclick: $scope.agregar
           }
        ]
        */
    }
    
    //Herencia prototipica
    CargosCtrl.prototype = Object.create(BaseGridCtrl.prototype);
    
    //Registro del controlador
    igglobal.controller('CargosCtrl', CargosCtrl);