none
Binder Model doesn't work in currecy field RRS feed

  • Pregunta

  • I have a project using MVC 4.

    I have a entity that store data of a amount in a decimal, it has the DataAnnotations attibute of DataFormatString = {0:C} for present the field in Currency format.

    That works fine but when i try to do the post, always show up the validation "The field Monto de Prestamo: must be a number." and don't let me send the data because the amount is in the format, example "$200,000.00".

    I have a model binder for that entity doing a TryParse for change the format of the data but is not working

    I don't know what is wrong

    My code is this:

    Model:

    [MetadataType(typeof(SolicitudMD))]
    public partial class Solicitud
    {
    	public class SolicitudMD
    	{
    		[Key]
    		public int SolicitudCreditoId { get; set; }
    
    		public byte PlazoId { get; set; }
    		public byte PeriodicidadId { get; set; }
    		public int UserId { get; set; }
    
    		[Display(Name = "Monto de Prestamo:")]
    		[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:C}")]
    		[Required(ErrorMessage = "Necesita especificar un valor para el campo 'Monto Prestamo', puede ser cero.")]
    		public decimal Monto { get; set; }
    	}
    }

    ModelBinder:

    public class SolicitudModelBinder : DefaultModelBinder 
    {
    	public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    	{
    		var amount = bindingContext.ValueProvider.GetValue("Monto");
    		if (amount != null)
    		{
    			decimal amountFormated;
    			if (decimal.TryParse(amount.AttemptedValue, NumberStyles.Currency, null, out amountFormated))
    			{
    				return new Solicitud
    				{
    					Monto  = amountFormated
    				};
    			}
    			else
    			{
    				bindingContext.ModelState.AddModelError("Monto", "Invalid Monto");
    			}
    		}
    		return base.BindModel(controllerContext, bindingContext);
    	}
    }

    View:

    @model Solicitud

    <td class="texto_negro"> <div class="boxLeft"></div> <div class="boxMiddle" style="width: 95%"> @Html.EditorFor(m => m.Monto) @Html.ValidationMessageFor(x => x.Monto) </div> <div class="boxRight"></div> </td>

    AppStart:

    ModelBinders.Binders.Add(typeof(Solicitud), new SolicitudModelBinder());



    • Editado geed64 miércoles, 10 de julio de 2013 20:34
    miércoles, 10 de julio de 2013 19:56

Todas las respuestas

  • hola

    el tema es que el formatlo lo deberias aplciar cuando el campo no es editable, es logico que si aplcias un formato a un monto en un textbox y depsues quieres enviarlo de nuevo va a fallar la conversion

    no deberias definir el DataFormatString = "{0:C}

    sino simplemente en el label asociado a este campo indicar en que moneda se expresa, al estilo

    Monto ($)

    eso pondrias en el label y luego en el textbox el monto sin formato

    si vas a mostrar el valor en readonly o en un label entonces si aplica formato

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 11 de julio de 2013 3:35