У меня есть пользовательский атрибут с именем FileLink
, который использует DisplayForModel()
для генерации ActionLink
для контроллера со значением ID.
Атрибут выглядит следующим образом:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public sealed class FileLinkAttribute : Attribute
{
public string ActionName { get; set; }
public string ControllerName { get; set; }
public string IdPropertyName { get; set; }
public FileLinkAttribute(string actionName, string controllerName, string idPropertyName)
{
ActionName = actionName;
ControllerName = controllerName;
IdPropertyName = idName;
}
}
Используется ли он в модели представления, например:
public class MyViewModel
{
[HiddenInput(DisplayValue = false)]
public int? Id { get; set; }
[HiddenInput(DisplayValue = false)]
public int? TargetId { get; set; }
[FileLink("SomeAction", "SomeController", "TargetId")]
public string Name { get; set; }
}
У меня есть пользовательский MetadataProvider
, полученный из DataAnnotationsModelMetadataProvider
, который помещает значения атрибута в метаданные AdditionalValues следующим образом:
// retrieve the values to generate a file link
var fileLinkAttributes = attributes.OfType<FileLinkAttribute>();
if (fileLinkAttributes.Any())
{
var fileLinkAttribute = fileLinkAttributes.First();
metadata.AdditionalValues["FileLinkAttribute"] = fileLinkAttribute;
metadata.TemplateHint = "FileLink";
}
Цель состоит в том, чтобы DisplayForModel
вызвал DisplayTemplate
ниже, чтобы сгенерировать ссылку со значением в TargetId
из MyViewModel
.Поэтому, если TargetId
равно 5, ссылка будет «SomeController / SomeAction / 5»
// This DisplayTemplate for use with the "FileLinkAttribute"
//
// Usage: [FileLinkAttribute("ActionName","ControllerName","IdPropertyName")]
var fileLinkAttribute = (FileLinkAttribute)ViewData.ModelMetadata.AdditionalValues["FileLinkAttribute"];
var targetId = *<GET VALUE OF CONTAINER MODEL IdPropertyName>*;
@Html.ActionLink((string)ViewData.Model, fileLinkAttribute.ActionName, fileLinkAttribute.ControllerName, new { Id = targetId}, null)
. После всего этого я не могу получить доступ к содержащему объекту, чтобы получить значение свойства из TargetId.Я попытался сделать это в Атрибуте, в Поставщике и в DisplayTemplate, но безуспешно.
Есть ли способ или место, к которому я могу получить доступ к этому значению, чтобы выполнить свое намерение прочитать значение свойства изобъект viewmodel, содержащий атрибут?