ASP.NET MVC: почему я не могу установить метаданные модели ShowForEdit с атрибутом? - PullRequest
3 голосов
/ 10 июня 2010

Почему я не могу установить ShowForEdit метаданные модели с атрибутом?

Кажется, что единственный атрибут, предоставленный для изменения этого, - [ScaffoldColumn], который устанавливает ShowForEdit и ShowForDisplay,это не то, что я хочу сделать.Я хочу иметь возможность комментировать два отдельно от моей модели.

Ответы [ 2 ]

5 голосов
/ 10 июня 2010

Потому что это не поддерживается из коробки. AFAIK причина в том, что атрибут dataannotations, поддерживающий эту функцию, находится в .net 4.0, и для обеспечения совместимости MVC 3.5 и 4.0 их необходимо исключить.

Самый простой способ исправить это - реализовать собственный атрибут редактирования / показа, как показано в этом вопросе / ответе:

Отображение различных полей в режимах EditorForModel и DisplayForModel в MVC2

5 голосов
/ 10 июня 2010

К какому типу недвижимости вы его применяете?Если мы используем Reflector, мы можем обнаружить, что свойства ShowForEdit и ShowForDisplay используются в следующих функциях:

ShowForEdit: System.Web.Mvc.Html.DefaultEditorTemplates.ShouldShow (...)

ShowForDisplay: System.Web.Mvc.Html.DefaultDisplayTemplates.ShouldShow (...)

Определение этих методов:

private static bool ShouldShow(ModelMetadata metadata, TemplateInfo templateInfo)
{
  return (((metadata.ShowForEdit && (metadata.ModelType != typeof(EntityState))) && !metadata.IsComplexType) && !templateInfo.Visited(metadata));
}

private static bool ShouldShow(ModelMetadata metadata, TemplateInfo templateInfo)
{
  return (((metadata.ShowForDisplay && (metadata.ModelType != typeof(EntityState))) && !metadata.IsComplexType) && !templateInfo.Visited(metadata));
}

Игнорирование проверки очевидного свойства (metadata.ShowForX), вы можете видеть, что он проверяет, является ли модель экземпляром EntityState (возможно, нет), а затем проверяет наличие метаданных. IsComplexType.

Здесь мы можем посмотреть на свойство IsComplexType:

public virtual bool IsComplexType
{
  get
  {
    return !TypeDescriptor.GetConverter(this.ModelType).CanConvertFrom(typeof(string));
  }
}

Это означает, что он вернет true, если модель не может быть преобразована из строки, а в методах ShouldShow () он покажет, не является ли он сложным типом, т. Е. ЗначениемМОЖЕТ быть преобразовано из строки.

Что вам нужно будет сделать, это создать TypeConverter, который может преобразовать строку в модель, например:

Модель:

[TypeConverter(typeof(ItemConverter))]
public class Item 
{
  #region Properties
  public string Text { get; set; }
  #endregion
}

И конвертер:

public class ItemConverter : TypeConverter
{
  #region Methods
  public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
  {
    if (sourceType == typeof(string))
      return true;

    return base.CanConvertFrom(context, sourceType);
  }

  public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
  {
    if (value.GetType() == typeof(string)) 
    {
      return new Item { Text = (string)value };
    }

    return base.ConvertFrom(context, culture, value);
  }
  #endregion
}

С этим на месте, попробуйте еще раз и посмотрите, поможет ли это.

...