如何在dataannotation中使用变量或类属性

时间:2012-03-06 22:53:10

标签: asp.net-mvc-3 attributes data-annotations custom-attributes

有没有办法可以将非静态数据添加到dataannotation属性(标准属性或继承自标准数据注释(显示,范围等)或属性基类的自定义属性)?我希望能做到这样的事情:

public class ReportingDateTime
{
    [Display(Name=this.FieldName)]
    [Reporting.Core.CustomDisplay(this.FieldName)]

    public DateTime Field { get; set; }

    private string FieldName;

    public ReportingDateTime(string fieldName)
    {
        this.FieldName = fieldName;
    }
}

或者,有没有办法在类的构造函数中更改属性的元数据,如下所示:

public class ReportingDateTime
{
    public DateTime Field { get; set; }

    private string FieldName;

    public ReportingDateTime(string fieldName)
    {
        Field.metadata.DisplayName = "Test Date";
    }
}

从我所看到的,传递对象类型(自定义属性期望自定义对象的新实例)有一些成功但我主要看的是简单的数据类型(string,int,double)也许是通用集合(列表,字典等)

1 个答案:

答案 0 :(得分:0)

据我所知,目前无法做到这一点。最终为我工作的是为该类提供自定义编辑器/显示模板,以便我可以将自己的字段用于显示属性,如下所示:

@inherits System.Web.Mvc.WebViewPage<Reporting.Fields.ReportingNumber>
<div class="editor-label">
    @Model.FieldName
</div>
<div class="editor-field">
    @if (Model.ReadOnly)
    {
        <div class="@Model.FieldSubType">
            @Model.Field
        </div>
    }
    else
    {
        @Html.TextBox("Field", Model.Field, new { @class = @Model.FieldSubType, @title = @Model.ToolTip })
        @Html.ValidationMessageFor(model => model.Field)
    }

对于验证,我建议使用FluentValidation的条件验证(http://fluentvalidation.codeplex.com/wikipage?title=Customising&referringTitle=Documentation&ANCHOR#WhenUnless),并使用类中的属性作为条件语句。

namespace Reporting.Validation
{
    using FluentValidation;
    using Reporting.Fields;

    public class ReportingNumberValidation : AbstractValidator<ReportingNumber>
    {
        public ReportingNumberValidation()
        {
            RuleFor(m => m.Field).NotEmpty().WithMessage("*").When(m => m.Required);
            RuleFor(m => m.Field).GreaterThanOrEqualTo(m => m.MinimumValue.Value).When(m => m.MinimumValue.HasValue);
            RuleFor(m => m.Field).LessThanOrEqualTo(m => m.MaximumValue.Value).When(m => m.MaximumValue.HasValue);
        }
    }
}