2

Iv は、以下のような MetaDataProvider を作成し、エディター テンプレートと組み合わせて使用​​しています。DisplayName は正しく機能していますが、何らかの理由で ShowForEdit の値は効果がありません。何か案は?

public class MyModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
        protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType,
                                                        Func<object> modelAccessor, Type modelType, string propertyName)
        {
            var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);          I

            metadata.DisplayName = "test";

            metadata.ShowForEdit = false;
            metadata.ShowForDisplay = false;
            metadata.HideSurroundingHtml = true;

            return metadata;
        }
}
4

1 に答える 1

1

これは、属性を使用して ShowForEdit モデル メタデータを設定できないのはなぜですか?という質問に似ているようです。、だから私はここで私の答えを複製します:

どのような物件に適用されますか? 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 のインスタンスであるかどうか (おそらくそうではない) をチェックしてから、metadata.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
}

それが整ったら、もう一度試して、それが役立つかどうかを確認してください.

于 2010-06-10T12:29:42.330 に答える