2009-04-20 6 views
1

Stellen Sie sich diesen Fall:Bessere Möglichkeit, diesen Fall REST

Eine Farbe hat eine ID. Leicht genug.
Die gleiche Farbe kann, abhängig von der Sprache des Benutzers Pref, Suchabfrage und persönliche Vorlieben einen anderen Anzeigenamen haben.
Dieser Anzeigename wird nicht definiert, muss jedoch an jede Seite weitergegeben werden, damit der Benutzer bei jeder Farbangabe mit dem gleichen Etikett konfrontiert wird.
Darüber hinaus (und nur um diese Erklärung kurz zu halten, gehen Sie mit mir auf diesem) kann der Name auch leer sein (so ist der Parameter optional).

Da es viele solcher Parameter gibt und die Parameter optional sind und ich nicht alle diese optionalen Parameter auf die hässliche Abfragezeichenfolge schieben möchte, habe ich einen einzelnen URL-Parameter zur Identifizierung der Farbe erstellt, die im Grunde die Farbe setzt ID und die optionalen Parameter in einem Parameter, getrennt durch ein benutzerdefiniertes Trennzeichen.

Beispiele:

  • Color.mvc/Anzeige/123456 - BorisRed - AnotherParameter
  • Formula.mvc/Anzeige/123456 - BorisRed - AnotherParameter/987654

I habe eine Hilfsmethode, die diese Zeichenfolge generiert und eine, die diese Zeichenfolge analysiert.

Es funktioniert soweit gut, aber ich denke, es gibt wahrscheinlich einen besseren Weg, dies zu tun. Irgendwelche Vorschläge?

Antwort

0

Sieht OK für mich aus; Sie möchten vielleicht sehen, ob ein "Modellbinder" in der Parsing-Ebene verwendet werden könnte, so dass Sie nur {id} in der Route verwenden und SomeAction(MyColor id) haben und der Modellbinder automatisch die id analysieren lässt. Alternativ (und vielleicht einfacher), ich scheine neu zu berechnen, dass es auch TypeConverter hier verwenden wird - also vielleicht schreiben Sie eine TypeConverter für Ihre Farbklasse/Struktur (MyColor oben).

Beispiel Konverter:

[TypeConverter(typeof(MyColorConverter))] 
public class MyColor 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public override string ToString() 
    { 
     return Name; 
    } 
} 

class MyColorConverter : TypeConverter 
{ 
    public override bool CanConvertFrom(ITypeDescriptorContext context, 
     Type sourceType) 
    { 
     return sourceType == typeof(string) 
      || base.CanConvertFrom(context, sourceType); 
    } 
    public override object ConvertFrom(ITypeDescriptorContext context, 
     System.Globalization.CultureInfo culture, object value) 
    { 
     if (value != null && value is string) 
     { 
      string[] parts = ((string)value).Split(new string[] {"--"}, 
       StringSplitOptions.None); 
      MyColor color = new MyColor(); 
      if(parts.Length > 0) color.Id = int.Parse(parts[0]); 
      if(parts.Length > 1) color.Name = parts[1]; 
      return color; 
     } 
     return base.ConvertFrom(context, culture, value); 
    } 
    public override bool CanConvertTo(ITypeDescriptorContext context, 
     Type destinationType) 
    { 
     return destinationType == typeof(string) 
      || base.CanConvertTo(context, destinationType); 
    } 
    public override object ConvertTo(ITypeDescriptorContext context, 
     System.Globalization.CultureInfo culture, object value, 
     Type destinationType) 
    { 
     if (destinationType == typeof(string)) 
     { 
      MyColor color = (MyColor)value; 
      return color.Id + "--" + color.Name; 
     } 
     return base.ConvertTo(context, culture, value, destinationType); 
    } 
} 
+0

Hmm, so dass die Paste-Multiple-Dinge-in-one-string nicht machen Sie schaudern? Ich könnte das Ganze tatsächlich in einen Typwandler umwandeln. Momentan habe ich die Logik in einer Hilfsmethode die ich manuell anrufe. Also kein Schwitzen da. –

+0

Nein, ich schaudere nicht. Vergleichbar mit Dingen wie Datumsbereichen, wo ich gesehen habe, dass Leute diese Art von Ansatz aktiv empfehlen, anstatt die Portionen in Routen (/ von/nach) oder Abfragezeichenfolgen (? Von = & nach =) zu trennen. –