如何在EditorTemplate、net8 ASP.NET Core中获取模型的Container

问题描述 投票:0回答:1

我正在寻找在 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 需要多个属性才能从容器模型中检索,因此获取该模型至关重要。

c# asp.net-core razor
1个回答
0
投票

您需要使用 ViewData.ModelExplorer.Container 而不是 ModelMetadata。

© www.soinside.com 2019 - 2024. All rights reserved.