2010-06-10 6 views

Répondre

5

Parce qu'il n'est pas pris en charge dès la sortie de la boîte. La raison en est que l'attribut dataannotations qui supporte cette fonctionnalité est en .net 4.0 et que pour être compatible avec MVC 3.5 et 4.0 ils doivent être exclus.

La meilleure façon de résoudre ce problème est d'avoir à mettre en œuvre votre propre attribut Modifier/Afficher comme démontré dans cette Question/Réponse:

Showing Different fields in EditorForModel vs. DisplayForModel modes in MVC2

+0

Cela fonctionnerait-il pour les propriétés qui n'utilisent pas de primitives? –

+0

Oui cela fonctionne pour les primitives non. – jfar

+0

Merci pour votre réponse. – UpTheCreek

4

Quel est le type de propriété auquel vous l'appliquez? Si nous utilisons réflecteur, nous pouvons découvrir que les propriétés de ShowForEdit et ShowForDisplay sont utilisés dans les fonctions suivantes:

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

ShowForDisplay: Système .Web.Mvc.Html.DefaultDisplayTemplates.ShouldShow (...)

la définition de ces méthodes est:

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)); 
} 

Ignorer la vérification de la propriété évidente (metadata.ShowForX), vous pouvez voir qu'il est vérifier si le modèle est un n instance de EntityState (n'est probablement pas), puis une vérification de metadata.IsComplexType.

Nous pouvons regarder la propriété isComplexType ici:

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

Qu'est-ce qui dit est qu'il retourne vrai si le modèle ne peut pas être converti à partir d'une chaîne, et dans les méthodes ShouldShow(), il montre si ce n'est pas un type complexe, c'est-à-dire que la valeur CAN peut être convertie à partir d'une chaîne.

Ce que vous devez faire, est de créer un TypeConverter qui peut convertir une chaîne, au modèle, par exemple:

Un modèle:

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

Et un convertisseur:

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 
} 

Avec cela en place, essayez à nouveau et voir si cela aide.

+4

Wow. Je ne sais pas si c'est de la folie ou de la brillance. ;) – jfar

+0

Lol, probablement un peu des deux;) –