Mostrando las entradas con la etiqueta Tips andTricks. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Tips andTricks. Mostrar todas las entradas

3 abr 2014

// // 2 comentarios

ASP .NET MVC - Aumentar el tamaño máximo permitido para serializar en formato JSON

Introducción


Al usar JSON como formato de transferencia de nuestros datos desde el controlador e intentar enviar un volumen considerable de datos, podríamos tener un error como el siguiente:

Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property.

Esto se da debido que el tamaño máximo para la serialización tiene un tope configurado en la propiedad maxJsonLength que se usa para enviar la información en formato JSON.

Cambiando el valor máximo permitido


Para resolver el problema podríamos intentar cambiando el archivo de configuración de nuestra aplicación así:
<system.web.extensions>
  <scripting>
    <webServices>
      <jsonSerialization maxJsonLength="50000000"/>
    </webServices>
  </scripting>
</system.web.extensions>


Pero curiosamente esta configuración no hace efecto en los resultados que deseamos, el motivo de esto se encuentra como nota en la documentación de la propiedad, donde indica que solo se usa para instancias internas, así que toca modificar por otro lado, para lo cual tenemos 2 opciones:

Asignar un valor a la propiedad.


Si normalmente devolvemos la data de esta manera:

return Json(data, JsonRequestBehavior.DenyGet); 

Deberíamos cambiar a esto:

var jsonResult = Json(data, JsonRequestBehavior.DenyGet);
jsonResult.MaxJsonLength = int.MaxValue;
return jsonResult; 

Si nos fijamos al inicio la propiedad tiene valor nulo, así que al asignarle el valor que deseamos como tope para la serialización se va a poder enviar la data sin ningún problema.

Sobrescribir el controlador base


El método Json esta implementado en la clase Controller, que es la clase base de la cual heredan todos los controladores, si necesitamos hacer el cambio para todo nuestro proyecto podemos crear un controlador base que herede de esta clase y nuestros controladores hacerlos heredar de esta nueva clase o si lo deseamos para un controlador especifico solo podemos sobrescribir el método dentro de nuestro controlador de la siguiente manera:

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult()
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior,
        MaxJsonLength = Int32.MaxValue
    };
}

Con esto ya no tendríamos el error mencionado inicialmente, podrían cambiar el Int32.MaxValue por algún valor entero que deseen que se restrinja.
Leer post completo

29 ene 2014

// // Comentar

ASP .NET MVC - Mostrar mensajes de validación de controles en HTML


Introducción


En ASP .NET MVC tenemos un diccionario llamado Model State que almacena los errores de validación que se puedan generar al enviar los datos de un formulario y estos se puedan mostrar al usuario a través de una key que los identifica, pues bien el detalle de esto es que mostrara los mensajes como simple texto y para una necesidad en particular se puede requerir que estos mensajes se muestren en HTML, para ello describo en este post como lograrlo.


Creación de la clase helper


Para mostrar los mensajes de validación en HTML crearemos un helper para lo cual tomaremos como referencia el mismo código fuente de ASP .NET MVC que esta disponible en Codeplex y le haremos algunas modificaciones para lograr nuestro objetivo.

La clase que usaremos para adaptarla a nuestras necesidades será ValidationExtencion.cs de la cual tomaremos los siguientes métodos:
 
public static MvcHtmlString ValidationMessage(this HtmlHelper htmlHelper, string modelName, object htmlAttributes)




 




public static MvcHtmlString ValidationMessage(this HtmlHelper htmlHelper, string modelName, string validationMessage, IDictionary<string, object> htmlAttributes)




 




private static MvcHtmlString ValidationMessageHelper(this HtmlHelper htmlHelper, ModelMetadata modelMetadata, string expression, string validationMessage, IDictionary<string, object> htmlAttributes)




 




private static FieldValidationMetadata ApplyFieldValidationMetadata(HtmlHelper htmlHelper, ModelMetadata modelMetadata, string modelName)




 




private static string GetInvalidPropertyValueResource(HttpContextBase httpContext)




 




private static string GetUserErrorMessageOrDefault(HttpContextBase httpContext, ModelError error, ModelState modelState)





Además de estos métodos de los cuales modificaremos algunos también agregaremos un método, debido a que en ASP .NET MVC esta declarado como interno y no podemos usarlos desde el helper, lo creamos dentro del mismo helper:



 




public static MvcHtmlString ToMvcHtmlString(this TagBuilder builder, TagRenderMode renderMode)







Modificación de métodos



Una vez copiados los métodos a la clase que será nuestro helper, debe quedarnos similar a la imagen siguiente


 




 


Primero hay que renombrar el método ValidationMessage para que se llame ValidationMessageHTML que será así como lo llamaremos desde nuestras vistas.


 


Ahora  el método principal que debemos hacer los cambios es ValidationMessageHelper, dentro de este método cambiamos la línea








FormContext formContext = htmlHelper.ViewContext.GetFormContextForClientValidation();






por


 




FormContext formContext = htmlHelper.ViewContext.ClientValidationEnabled ? htmlHelper.ViewContext.FormContext : null;




 


Esto, debido a que se están usando métodos internos de ASP .NET MVC y no los tenemos disponibles en nuestra clase.


 


También cambiamos la línea principal donde hará que el texto lo devuelva en HTML.


 




builder.SetInnerText(GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, modelState));




por


 




builder.InnerHtml = GetUserErrorMessageOrDefault(htmlHelper.ViewContext.HttpContext, modelError, modelState);




 


Con estos cambios aplicados a los métodos ya podemos hacer uso del helper para que nos muestre los mensajes de error en HTML, simplemente llamándolo de la siguiente manera:








@Html.ValidationMessageHTML("keyerror", new { @class = "field-validation-error-html" })






Les dejo la clase helper que muestro en el post para que la puedan usar directamente.





Leer post completo

8 jun 2012

// // Comentar

Validar complejidad de claves de lado del cliente en ASP .NET

Muchas veces necesitamos en nuestros desarrollos obligar a que el usuario ingrese una clave con cierto nivel de complejidad por razones de seguridad, en este post, detallaré una forma fácil de poder implementar esto en una aplicación ASP .NET de lado del cliente, no solo validando que la clave sea compleja, sino que también indicando el nivel de complejidad mientras va escribiendo.

image

Introducción

Para poder ejemplificar esto, vamos a crear un formulario de cambio de clave, el cual tendremos estructurado como la imagen anterior, no consideraremos el código para hacer la validación de la clave anterior o el cambio de clave, únicamente nos centraremos en validar la complejidad de la nueva clave e indicarle esto al usuario.

Mostrando el nivel de complejidad

Para realizar esto, recurriremos al control PasswordStrength del Ajax Control Toolkit que nos permitirá establecer algunos parámetros de complejidad que vamos a requerir para la clave y según estos parámetros y criterios definidos nos irá mostrando en pantalla el nivel de complejidad que tiene la clave que estamos escribiendo.

<asp:TextBox runat="server" ID="txtNuevaClave" TextMode="Password" ValidationGroup="Enviar" />
<act:PasswordStrength ID="txtNuevaClave_PasswordStrength" runat="server" 
    Enabled="True" MinimumNumericCharacters="1" PrefixText="Complejidad: " 
    TargetControlID="txtNuevaClave" TextStrengthDescriptions="Baja;Media;Alta" 
    MinimumLowerCaseCharacters="1" PreferredPasswordLength="6" 
    RequiresUpperAndLowerCaseCharacters="True">
</act:PasswordStrength>

Este código nos permitirá ver el efecto que se aprecia en la imagen anterior al momento de digitar la nueva clave, para lo cual necesitamos configurar algunas propiedades:


MinimumNumericCharacters – Esto nos indica como mínimo cuantos caracteres numéricos debe tener la clave.
PrefixText – Es el prefijo que ira al momento de mostrarse la complejidad de la clave.
TargetControlID – Es el control al cual estará asociado esta validación.
TextStrengthDescriptions – Es la descripción que tendrán los distintos niveles de seguridad que consideremos, separados por ponto y coma.
MinimumLowerCaseCharacters – Esto nos indica como mínimo cuantos caracteres en minúscula se debe considerar, pero necesita de la propiedad RequiresUpperAndLowerCaseCharacters para tener efecto.
PreferredPasswordLength – Esto nos indica el tamaño mínimo requerido para considerar la clave en el ultimo nivel de validación, en el caso del ejemplo “Alta”, tener en cuenta que esto solo sirve para evaluar el nivel de complejidad, pero no valida el TextBox que tenga como mínimo esta cantidad de dígitos.
RequiresUpperAndLowerCaseCharacters – Esta propiedad sirve para activar las propiedades de mínimo minúsculas y mayúsculas requeridas.


Con esta configuración mínima, estamos pidiendo una clave que tenga al menos 6 dígitos, con una minúscula y un numero al menos.


Validando el nivel del complejidad


Ya anteriormente hicimos que se muestre el nivel de complejidad de una clave según los parámetros establecidos, pero esto no realiza una validación al momento de enviar estos datos, simplemente nos indica la complejidad que tiene lo que vamos escribiendo.


Entonces para validar la clave, haremos uso del control RegularExpressionValidator que si nos permitirá realizar esta validación con una expresión regular.



<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" 
    ControlToValidate="txtNuevaClave" 
    ErrorMessage="La clave debe ser como minimo de 6 digitos y al menos un número" 
    ForeColor="Red" 
    ValidationExpression="(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{6,12})$" 
    ValidationGroup="Enviar">**</asp:RegularExpressionValidator>
<act:ValidatorCalloutExtender ID="RegularExpressionValidator1_ValidatorCalloutExtender" 
    runat="server" Enabled="True" TargetControlID="RegularExpressionValidator1">
</act:ValidatorCalloutExtender>

Aquí tenemos el control con extender del Ajax Control Toolkit agregado para que muestre el mensaje de forma mas amigable.


En este control básicamente configuramos el mensaje que debe mostrarse y la expresión regular que hará la misma validación de mínimo 6 caracteres alfanuméricos.


image


Con esto logramos exigirle al usuario un cierto nivel de complejidad para su clave y también indicarle el nivel de complejidad que va teniendo el texto que va digitando de una forma muy intuitiva.


Espero les sea de utilidad y si pueden aportar con otras formas alternativas, pues bienvenido.

Leer post completo

20 sept 2009

// // 3 comentarios

The requested database is not defined in configuration.

Si alguna vez están trabajando con Enterprise Library o Repository Factory, quizá les pueda dar este error al momento de hacer la llamada a la base de datos, es por que hay que definir algunos elemento en el nuestro archivo de configuración del proyecto que hace la referencia a la clase que se accede a la base de datos.


En mi caso me ha funcionado lo siguiente:


Agregar los tags en configSections.

<configSections> 
  <section name="repositoryFactory" type="Microsoft.Practices.Repository.Configuration.
RepositoryFactorySection, Microsoft.Practices.Repository, Version=1.0.0.0, 
Culture=neutral, PublicKeyToken=null" /> 
  <section name="dataConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Data.
Configuration.DatabaseSettings, Microsoft.Practices.EnterpriseLibrary.Data, 
Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> 
</configSections>
 

Ahora definiremos la conexión por defecto de la aplicación

<dataConfiguration defaultDatabase="DefaultConnectionString" />

Esta cadena de conexión debe esta definida dentro de ConnectionStrings
 
<add name="DefaultConnectionString" 
connectionString="Data Source=.;Initial Catalog=Database;Integrated Security=True" 
providerName="System.Data.SqlClient" />
 

Teniendo definido esto ahora cuando hagamos llamadas a nuestra clase, en mi caso usando Repository Factory seria así:

ClaseRepository repository = new ClaseRepository("DefaultConnectionString");

Con esto ya no deberíamos tener ese error, al menos en mi caso ha funcionado si tienen mas aportes sobre el tema y posibles soluciones, agradeceré sus comentarios.

Leer post completo

31 ago 2009

// // 3 comentarios

Como permitir leer Archivos Excel 2007 desde Sistemas de 64 bits (x64)

Quizá esto le pueda pasar cuando trabaje ya sea en Windows Vista o en mi caso Windows 7 x64, he intentado leer un archivo Excel 2007 desde una aplicación en .NET y me daba el siguiente error:

El proveedor Microsoft.ACE.OLEDB.12.0 no está registrado en el equipo local. o en ingles

The Microsoft.ACE.OLEDB.12.0 provider is not registered on the local machine.

Pues resulta que esto es debido a que no hay controladores de office para x64, asi que hay que cambiar el tipo de compilación de la aplicación, que por defecto esta en “Any CPU” a “x86”, esto en las propiedades->Build.

Con esto ya se pueden leer los archivos con total normalidad, espero les sirva de algo.

Leer post completo

27 oct 2007

// // Comentar

Aplicaciones heredadas en ASP .NET 2.0

Cuando trabajamos con ASP .NET a veces tenemos la necesidad de tener múltiples aplicaciones bajo un mismo servidor es decir tenemos una aplicación el directorio principal y en subdirectorios tenemos mas aplicaciones, pero de esto surge un problema, que cada aplicación que se encuentra bajo un subdirectorio hereda las configuraciones establecidas en el archivo web.config del directorio raíz, para solucionar este problema se usan muchos como allowOverride, lockAttributes, lockAllAttributesExcept, lockAllElementsExcept, lockItem and lockElements pero hay algo mucho mejor que esto y es nuevo en ASP .NET 2.0.

Algo muy particular seria un error como este en una aplicacion:

Configuration Error

Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.

Parser Error Message: Could not load type 'MyWebPagesStarterKit.Providers.CustomRoleProvider'.

Source Error:


Line 50:       <providers>
Line 51: <clear/>
Line 52: <add name="CustomRoleProvider" type="MyWebPagesStarterKit.Providers.CustomRoleProvider"/>
Line 53: </providers>
Line 54: </roleManager>

Para arreglar esto tenemos el atributo inheritInChildApplications para no permitir heredar una sección entera de configuración.

La forma de implementar este atributo es de la siguiente manera:

<location path="." inheritInChildApplications="false">
<system.web>
<!-- Aqui la configuracion que no deseas heredar -->
</system.web>
</location>
De esta manera ya podemos tener todas las aplicaciones heredadas que deseemos.

Espero este pequeño aporte les sirva.

Saludos,
Leer post completo