Я использую производный атрибут UIHint
для доставки свойств из модели представления в шаблон редактора с замечательным IMetadataAware
интерфейсом 1 , о котором я узнал только вчера.
Обратите внимание, как вызов базового конструктора вызывает имя шаблона редактора, который я написал специально для добавления атрибутов к фактическому помощнику в качестве параметров.Константа KnownUiHints.SelectionOther
, передаваемая параметру UIHint
, равна «SelectionOtherInput», названию шаблона редактора.
Параметры помощника доступны для кода помощника.
НапримерМой DropDownAttribute
передает свойства со следующим кодом:
public class SelectionOtherInputAttribute : UIHintAttribute, IMetadataAware
{
public SelectionOtherInputAttribute(string selectionElementName) : base(KnownUiHints.SelectionOther, KnownPresentationLayers.Mvc)
{
SelectionElementName = selectionElementName;
}
public SelectionOtherInputAttribute(string selectionElementName, object otherSelectionKey) : base(KnownUiHints.SelectionOther, KnownPresentationLayers.Mvc)
{
SelectionElementName = selectionElementName;
ControlParameters[SelectionOtherInputControlParameterKeys.OtherSelectionKey] = otherSelectionKey;
}
public string SelectionElementName { get; set; }
public object OtherSelectionKey { get; set; }
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.AdditionalValues["@OtherSelectionAttrinbuteNames.SelectionElementName"] = SelectionElementName;
metadata.AdditionalValues["@OtherSelectionAttrinbuteNames.OtherSelectionKey"] = OtherSelectionKey;
}
}
Вот мой шаблонный редактор SelectionOtherInput
.
@using OtherInput.Core
@{
var meta = ViewData.ModelMetadata.AdditionalValues;
var selectionElementName = (string)meta["@OtherSelectionAttrinbuteNames.SelectionElementName"];
var otherSelectionKey = meta["@OtherSelectionAttrinbuteNames.OtherSelectionKey"];
var inputElementname = ViewData.TemplateInfo.HtmlFieldPrefix;
}
@Html.SelectionOtherTextBoxFor(m => Model, selectionElementName, otherSelectionKey.ToString())
Затем я использую свой атрибут в модели представления следующим образом:
[SelectionOtherInput("EmploymentStatusId", 1)]
public string OtherEmploymentStatus { get; set; }
Это приводит к визуализации OtherEmploymentStatus
шаблоном редактора SelectionOtherInput
, который, в свою очередь, отображаетmy SelectionOtherTextBoxFor
helper, с атрибутами, переданными в качестве аргументов.