Как я могу использовать переменную или свойство класса в аннотации данных - PullRequest
1 голос
/ 07 марта 2012

Есть ли способ добавить нестатические данные в атрибуты аннотации данных (либо стандартные атрибуты, либо пользовательский атрибут, который наследует либо от стандартного аннотации данных (отображение, диапазон и т. Д.), Либо от базового класса атрибута)? Я надеюсь сделать что-то вроде этого:

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 голосов
/ 24 марта 2012

Насколько я могу судить, в настоящее время нет способа сделать это.В итоге у меня получилось создать собственные шаблоны редактора / отображения для этого класса, чтобы я мог использовать свои собственные поля для свойства отображения, например:

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