Question

Il y a un problème commun à écrire fortement typé Html aides. Le problème est de savoir comment récupérer paire nom propriété / valeur. Supposons que nous avons déclaration suivante d'aide Html:

public static string DatePickerFor<TModel>(this HtmlHelper<TModel> helper, Expression<Func<TModel, DateTime?>> expression) 

Il existe plusieurs solutions que j'ai trouvé: 1.

var value = expression.Compile()( helper.ViewData.Model );
string name = ExpressionHelper.GetExpressionText( expression );
string fullName = helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName( name );

2.

ModelMetadata metadata = ModelMetadata.FromLambdaExpression( expression, helper.ViewData );
Object value = metadata.Model;
String name = metadata.PropertyName;

3. obtenir le nom de membre utilisant uniquement MemberExpression

string GetPropertyName<T>(Expression<Func<T>> property)
{
    var propertyInfo = (property.Body as MemberExpression).Member as PropertyInfo;
    if (propertyInfo == null)
    {
        throw new ArgumentException("The lambda expression 'property' should point to a valid Property");
    }
    return propertyInfo.Name;
}

Tous ont autre la mise en œuvre du premier coup d'oeil (utilisé réflecteur pour enquêter) mais je ne creuser profondément dans.

Je l'ai coincé avec tant de façons de problème de détermination et aimerait savoir quelle solution est préférable pour des situations différentes et pourquoi?

Je vais être apprécié pour toute aide

Était-ce utile?

La solution

Ces solutions sont utilisées pour deux contextes différents.

1) est utilisé par les vues préfixe correctement les champs html en préparation pour la liaison modèle et n'a presque rien à voir avec ModelMetadata. Ce code fournira « Customer.Addresses [0] .ville » dans le cas où vous devez faire une forme de sous.

Cette méthode ne se préoccupe que PropertyInfo.Name. Cela ne vous donnera jamais le contenu d'un attribut [DisplayName].

2) Est-ce est principalement utilisé pour travailler avec Modelmetadata. J'utiliser la méthode à deux 99% du temps, sauf si vous avez besoin pour résoudre # 1. Cela permettra également obtenir les métadonnées associées à l'attribut DataAnnotations. Ce seuil de vous donner le contenu de [DisplayName].

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top