2011-04-06 4 views
0

J'ai un modèle avec une collectionmvc asp.net de lier un modèle spécifique

public class Model 
{ 
    IEnumerable<ModelPart> Parts {get;set;} 
} 

public class Parts 
{ 
    public string Prop1 {get;set;} 
    public string Prop2 {get;set;} 
} 

Mais le comming dans l'URL est assez méchant.

Il a cette forme

dhxGridObj_d3BIc6JfDidc_1_0 = & dhxGridObj_d3BIc6JfDidc_1_1 = sssss & dhxGridObj_d3BIc6JfDidc_1_2 = ssssss & dhxGridObj_d3BIc6JfDidc_2_0 = & dhxGridObj_d3BIc6JfDidc_2_1 = AAAA & dhxGridObj_d3BIc6JfDidc_2_2 = aaaaa

Il a trois parties séparées par soulignement

dhxGridObj_d3BIc6JfDidc_2_1

  1. Certains id dhxGridObj_d3BIc6JfDidc
  2. Row id 2
  3. cellule id 1

Je me demande quelle serait la meilleure façon lier à mon modèle.

Je pensais à renommer ce dhxGridObj_d3BIc6JfDidc_2_1 en model[2].Prop1 Où serait le meilleur endroit pour faire cela?

Répondre

2

Oh oui, c'est une enfer d'une chaîne de demande laide. Un classeur de modèle personnalisé est la façon d'analyser cette bête jusqu'à ce que vous trouviez une véritable solution à ce problème, ce qui, bien sûr, corrige le système envoyant cette merde pour se conformer à la syntaxe du modèle de classeur par défaut.

Et voici un exemple de quelque code zéro qui pourrait vous mettre sur la bonne voie:

public class MyModelBinder : DefaultModelBinder 
{ 
    private const string Prefix = "dhxGridObj_d3BIc6JfDidc"; 

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var model = base.BindModel(controllerContext, bindingContext) as Model; 
     var request = controllerContext.HttpContext.Request; 
     model.Parts = request 
      .Params 
      .Keys 
      .OfType<string>() 
      .Select(key => Regex.Match(key, Prefix + "_([0-9]+)_([0-9]+)")) 
      .Where(x => x.Success) 
      .Select(x => new 
      { 
       Row = x.Groups[1].Value, 
       Col = x.Groups[2].Value 
      }) 
      .GroupBy(x => x.Row) 
      .Select(x => new Parts 
      { 
       Prop1 = request[string.Format("{0}_{1}_{2}", Prefix, x.Key, x.ElementAt(0).Col)], 
       Prop2 = request[string.Format("{0}_{1}_{2}", Prefix, x.Key, x.ElementAt(1).Col)], 
      }); 
     return model; 
    } 
} 

qui sera enregistré dans Application_Start:

ModelBinders.Binders.Add(typeof(Model), new MyModelBinder()); 
+0

oublié de mentionner il y a aussi une certaine validation passe de la classe Parts. J'ai jeté un oeil à la classe defaultmodelbinder. Il y a quelques méthodes à redéfinir. Pourriez-vous donner un indice de ce que l'on serait le meilleur pour cela? – user256034

+0

@ user256034, vous dérivez de 'DefaultModelBinder' et remplacez la méthode' BindModel' où vous exécutez la logique d'analyse de ces paramètres de chaîne de requête laids et les lier à leurs valeurs de propriété correspondantes. –

+0

Wow c'est génial. Fonctionne comme un charme. Mais je suppose que je dois faire la validation par moi-même, n'est-ce pas? – user256034

Questions connexes