7

Je dois implémenter une fonctionnalité pour permettre aux utilisateurs d'entrer le prix sous n'importe quelle forme, c'est-à-dire d'autoriser 10 USD, 10 $, 10 $, ... en entrée.ASP.NET MVC - Classeur de modèle personnalisé capable de traiter les tableaux

Je voudrais résoudre ce problème en mettant en œuvre un modèle de classeur personnalisé pour la classe de prix.

class Price { decimal Value; int ID; } 

Le formulaire contient un tableau ou prix comme touches

keys: 
"Prices[0].Value" 
"Prices[0].ID" 
"Prices[1].Value" 
"Prices[1].ID" 
... 

Le ViewModel contient un prix bien:

public List<Price> Prices { get; set; } 

Le liant de modèle par défaut fonctionne bien aussi longtemps que l'utilisateur entre un chaîne décimale convertible dans l'entrée Value. Je voudrais autoriser des entrées comme "100 USD".

Mon ModelBinder pour le type de prix jusqu'à présent:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    Price res = new Price(); 
    var form = controllerContext.HttpContext.Request.Form; 
    string valueInput = ["Prices[0].Value"]; //how to determine which index I am processing? 
    res.Value = ParseInput(valueInput) 

    return res; 
} 

Comment puis-je mettre en œuvre un modèle sur mesure Binder qui gère les tableaux correctement?

+0

Ai-je deviner qu'un ID est l'ID utilisateur et non l'ID la devise? – AxelEckenberger

+0

C'est l'ID du type de prix, pas pertinent à cette question – Marek

+0

Pas besoin de plusieurs devises - nous sommes fixés à une monnaie unique, mais besoin de permettre différents types de formats d'entrée comme mentionné dans la question – Marek

Répondre

16

Got it: Le point est d'essayer de ne pas se lier à une seule instance de prix, mais plutôt mettre en œuvre un ModelBinder pour List<Price> Type:

public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     List<Price> res = new List<Price>(); 
     var form = controllerContext.HttpContext.Request.Form; 
     int i = 0; 
     while (!string.IsNullOrEmpty(form["Prices[" + i + "].PricingTypeID"])) 
     { 
      var p = new Price(); 
      p.Value = Process(form["Prices[" + i + "].Value"]); 
      p.PricingTypeID = int.Parse(form["Prices[" + i + "].PricingTypeID"]); 
      res.Add(p); 
      i++; 
     } 

     return res; 
    } 

//register for List<Price> 
ModelBinders.Binders[typeof(List<Price>)] = new PriceModelBinder(); 
Questions connexes