2009-04-20 3 views
1

이 경우를 상상해보십시오.이 케이스를 만드는 더 나은 방법 REST

색깔은 id입니다. 충분히 쉬워.
같은 언어는 사용자의 언어 설정에 따라 검색 쿼리와 개인 환경 설정이 다른 표시 이름을 가질 수 있습니다.
이 표시 이름은 정의되어 있지 않지만 각 페이지에 전달되어야하므로 사용자는 색상이 언급 될 때마다 동일한 레이블에 직면하게됩니다.
또한 (이 설명을 간략하게하기 위해 나와 함께 가십시오.) 이름도 비워 둘 수 있습니다 (매개 변수가 선택 사항 임).

이러한 매개 변수가 많고 매개 변수가 선택 사항이므로 이러한 모든 선택적 매개 변수를 추한 쿼리 문자열로 보내지 않으려 고합니다. 기본적으로 색을 지정하는 색을 식별하는 단일 URL 매개 변수를 만들었습니다 id 및 선택적 매개 변수를 하나의 매개 변수에 포함하고 사용자 지정 구분 기호로 구분합니다.

예 :

  • Color.mvc/디스플레이/123456 - BorisRed - AnotherParameter
  • Formula.mvc/디스플레이/123456 - BorisRed - AnotherParameter/987654

I 이 문자열을 생성하는 도우미 메서드와이 문자열을 구문 분석하는 도우 메서드가 있어야합니다.

지금까지 문제가 없지만이 방법을 사용하는 것이 좋습니다. 어떤 제안?

답변

0

나에게 잘 보입니다. "모델 바인더"를 구문 분석 계층에서 사용할 수 있는지 확인하여 경로에서 {id} 만 사용하고 SomeAction(MyColor id)을 갖고 모델 바인더에서 id을 자동으로 구문 분석하도록 할 수 있습니다. 또는 (아마도 더 간단하게) 나는 여기에 TypeConverter을 사용할 것이라는 것을 상기하는 것처럼 보입니다. - 따라서 색상 클래스/구조체에 대해 TypeConverter을 작성하십시오 (MyColor 위).

예 계산기 :

[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

흠, 그래서 페이스트 여러 가지 -에 - 하나의 문자열하면 전율하지 않습니다? 나는 사실 모든 것을 typeconverter에 넣을 수 있습니다. 현재 수동으로 호출하는 도우미 메서드에 논리가 있습니다. 그래서 거기에서 땀을 흘리지 마라. –

+0

아니, 그것은 나를 떨게하지 않는다. 날짜 범위와 비교할 때 사람들은 부분을 경로 (/ from/to) 또는 쿼리 문자열 (from = & to =)로 구분하는 대신 해당 유형의 접근 방식을 적극 권장합니다. –