2009-04-20 15 views
1

このケースを想像してみてください。このケースを改善するには

色はIDです。簡単に。
同じ色は、ユーザーの言語に応じて、検索クエリと個人設定の表示名が異なります。
この表示名は定義されていませんが、各ページに渡す必要がありますので、ユーザーは色が記述されるたびに同じラベルに直面します。
さらに、(この説明を簡潔にするために、私もこの記事を読んでください)名前は空白にすることもできます(パラメータはオプションです)。

このようなパラメータが多数あり、パラメータはオプションで、これらのオプションパラメータをすべて醜いクエリ文字列にプッシュしたくないため、基本的に色を指定する単一のURLパラメータを作成しましたidとオプションパラメータを1つのパラメータに指定し、カスタムデリミタで区切ります。

例:

  • Color.mvc /表示/ 123456 - BorisRed - AnotherParameter
  • Formula.mvc /表示/ 123456 - BorisRed - AnotherParameter/987654

Iこの文字列を生成するヘルパーメソッドと、この文字列を解析するヘルパーメソッドがあります。

これまでのところうまくいきましたが、おそらくこれを行うにはより良い方法があると思います。助言がありますか?

答えて

0

見た目はOKです。 「モデルバインダー」を構文解析レイヤーで使用できるかどうかを確認して、ルートで{id}だけを使用し、SomeAction(MyColor id)を持ち、モデルバインダーにidを自動的に解析させることができます。代わりに(おそらくもっと単純に)、私はここでもTypeConverterを使用することを思い起こさせるようです - あなたのカラークラス/構造体(上記MyColor)にはTypeConverterと書いてください。

例コンバータ:

[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

うーん、そうペースト複数の事・イン・ワンの文字列は、あなたが身震いことはありませんか?私は確かにすべてを型変換器に入れることができました。現在私は手動で呼び出すヘルパーメソッドのロジックを持っています。だからそこに汗がない。 –

+0

いいえ、それは私を震えさせません。私が見てきた日付範囲のようなものに匹敵するのは、部分をルート(/ from/to)またはクエリ文字列(?from =&to =)に分けるのではなく、そのタイプのアプローチを積極的にお勧めします。 –

関連する問題