Лучший способ сделать это дело REST - PullRequest
1 голос
/ 20 апреля 2009

Представьте себе этот случай:

У цвета есть идентификатор. Достаточно просто.
Один и тот же цвет может в зависимости от языкового предпочтения пользователя, поискового запроса и личных предпочтений иметь другое отображаемое имя.
Это отображаемое имя не является определяющим, но его необходимо передавать на каждую страницу, чтобы пользователь каждый раз сталкивался с одной и той же меткой при упоминании цвета.
Кроме того (и просто для краткости пояснения, пройдите со мной), имя также может быть пустым (поэтому параметр необязательный).

Поскольку таких параметров много, а параметры являются необязательными, и я не хочу помещать все эти необязательные параметры в строку запроса, я создал один URL-параметр, чтобы определить цвет, который в основном устанавливает идентификатор цвета и необязательные параметры в одном параметре, разделенные пользовательским разделителем.

Примеры:

  • Color.mvc / дисплей / 123456 - BorisRed - AnotherParameter
  • Formula.mvc / дисплей / 123456 - BorisRed - AnotherParameter / 987654

У меня есть вспомогательный метод, который генерирует эту строку, и метод, который анализирует эту строку.

Пока все работает нормально, но я чувствую, что, возможно, есть лучший способ сделать это. Есть предложения?

1 Ответ

0 голосов
/ 20 апреля 2009

выглядит хорошо для меня; Возможно, вы захотите посмотреть, можно ли использовать «связыватель модели» в слое анализа, чтобы вы использовали в маршруте только {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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...