0

我正在尝试组合一个个性化的 LabelFor,它采用数据注释中组装的类的所有属性,并随着属性更改我的标签。

例子:

[Obrigatorio]
[Display(Name = "Sexo")]
[SexoComTipoPessoa]
[NotMapped]
public int SexoID { get; set; }

这段代码没问题:

[AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]
public class SexoComTipoPessoa : ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var property = validationContext.ObjectInstance.GetType().GetProperty("TipoPessoaID");

        if (property == null)
            return new ValidationResult("Propriedade desconhecida: 'TipoPessoaID'");

        var propertyValue = property.GetValue(validationContext.ObjectInstance, null);

        /* Tipo de pessoa 2 - é pessoa juridicia */
        if (Convert.ToInt32(propertyValue) == 2)
        {
            if (Convert.ToInt32(value) != 3)
                return new ValidationResult("Para o tipo de pessoa 'Juridíca', deve ser selecionado o sexo 'Não aplicavél'!");
        }
        else if (Convert.ToInt32(propertyValue) == 1)
        {
            if (Convert.ToInt32(value) == 3)
                return new ValidationResult("Para o tipo de pessoa 'Física', deve ser selecionado o sexo 'Masculino' ou 'Feminino'!");
        }

        return ValidationResult.Success;
    }
}

此代码不行,当您想要属性 [Obrigatorio] 时,标签具有属性 Display (Name = "") 并添加“* Obrigatório”或 [SexoComTipoPessoa] 标签具有属性 Display (Name = "") 并添加" * Sexo deve ser compativel com tipo de pessoa"

公共静态类 LabelExtensions

{
  public static MvcHtmlString LabelWithTooltip<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression)
  {
      var metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);

      string htmlFieldName = ExpressionHelper.GetExpressionText(expression);                    
      string labelText = metaData.DisplayName ?? metaData.PropertyName ?? htmlFieldName.Split('.').Last();

      if (String.IsNullOrEmpty(labelText))
          return MvcHtmlString.Empty;

      var label = new TagBuilder("label");
      label.Attributes.Add("for", helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName));

      if (!string.IsNullOrEmpty(metaData.Description))
          label.Attributes.Add("title", metaData.Description);

      label.SetInnerText(labelText);
      return MvcHtmlString.Create(label.ToString());
  }
}
4

0 回答 0