我正在寻找在 EditorTemplate (.net8 asp.net core) 中检索容器的可能性
在 .net Framework 4.6 中有一个属性
ViewData.ModelMetadata.Container
但在 .net8 中没有这样的属性。我正在将项目从 4.6 重写为 .net8
我尝试使用 ModelExplorer 但没有成功。
EditorTemplate的代码用于澄清:
var attribute = ViewData.ModelMetadata.ContainerType
.GetProperty(ViewData.ModelMetadata.PropertyName)
.GetCustomAttributes(typeof(MediaPickerAttribute), false)
.Select(a => a as MediaPickerAttribute)
.FirstOrDefault();
// object container = ViewData.ModelMetadata.Container;
object container = ViewData.ModelMetadata.GetModelExplorerForType(ViewData.ModelMetadata.ModelType, Model).Container;
List<MediaDTO> valueObject = new List<MediaDTO>();
if (attribut.SelectedValuesProperty != null)
{
valueObject = ViewData.ModelMetadata.ContainerType
.GetProperty(attribut.SelectedValuesProperty)
.GetValue(container)
as List<MediaDTO>;
}
MediaPickerAttribute
public class MediaPickerAttribute : UIHintAttribute
{
/// <summary>
/// Dictionary for selected item (if any)
/// </summary>
public string SelectedValuesProperty { get; set; }
public bool YoutubeAllowed { get; set; } = true;
public bool Multiple { get; set; } = true;
.....
}
容器模型MediaEditDto
public class MediaEditDto
{
.....
// this property contains list of
[MediaPicker(SelectedValuesProperty = nameof(RelatedMedia), Multiple = true, YoutubeAllowed = false)]
[Display(Name = nameof(Resources.Photo.RelatedMedia), ResourceType = typeof(Resources.Photo))]
public List<Guid>? PhotosIds { get; set; }
public List<MediaDTO>? RelatedMedia { get; set; } = new List<MediaDTO>();
}
编辑.cshtml
<div class="row">
<div class="form-group ">
<label asp-for="Dto.PhotosIds" class="col-sm-3 control-label"></label>
<div class="col-md-9">
Html.EditorFor(model => model.Dto.PhotosIds)
<span asp-validation-for="Dto.PhotosIds" class="text-danger has-error help-block"></span>
</div>
</div>
</div>
我尝试通过ModelExplorer以不同的方式检索容器模型(MediaEditDto),但总是得到null,即:
// object container = ViewData.ModelMetadata.GetModelExplorerForType(ViewData.ModelMetadata.ContainerType, Model).Container;
我期望获得 container 指向 MediaEditDto 类型的对象,并且 valueObject 包含 RelatedMedia 值。
此示例经过简化,某些 EditorTemplates 需要多个属性才能从容器模型中检索,因此获取该模型至关重要。
您需要使用 ViewData.ModelExplorer.Container 而不是 ModelMetadata。