Как проверить пользовательский класс, полученный из атрибута на странице шаблона? - PullRequest
0 голосов
/ 01 июля 2011

Поэтому я создал собственный атрибут, который я буду использовать для украшения StepViewModels.

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public sealed class WizardStepAttribute : Attribute
{
    public String Name { get; set; }
    //public virtual int? Order { get; set; }
}

[PropertiesMustMatch("Email","ConfirmEmail")]
[WizardStep(Name="Preparer's Information")]
public class Step0ViewModel : IStepViewModel
{...

В моем IStepViewModel.cshtml я хочу отобразить имя свойства WizardStep, если оно существует.1006 *

Вот мой собственный код для того, что я хочу, чтобы произошло ...

@Html.Label(ViewModel.ModelMetaData.Properties("WizardStep").Name)

1 Ответ

1 голос
/ 01 июля 2011

Правильный способ сделать это - внедрить пользовательский поставщик метаданных модели, чтобы добавить метаданные в модель на основе атрибута:

public class MyModelMetadataProvider : DataAnnotationsModelMetadataProvider
{

    protected override ModelMetadata CreateMetadata(IEnumerable<System.Attribute> attributes, System.Type containerType, System.Func<object> modelAccessor, System.Type modelType, string propertyName)
    {
        var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
        var wizardStepAttr = attributes.OfType<WizardStepAttribute >().FirstOrDefault();
        if (wizardStepAttr != null)
        {
            metadata.AdditionalValues.Add("WizardStep", wizardStepAttr);
        }
        return metadata;
    }
}

... и затем извлечь эти данные из метаданных модели:

@Html.Label(((WizardStepAttribute)ViewModel.ModelMetaData.AdditionalValues["WizardStep"]).Name)

Вам нужно будет зарегистрировать этого провайдера метаданных в Application_Start следующим образом:

    ModelMetadataProviders.Current = new MyModelMetadataProvider();

(Обратите внимание, что некоторые расширения DI Framework для MVC автоматически подключаются, если вы связываете ModelMetadataProvider до MyModelMetadataProvider)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...