尝试使用 C# 导航 ModelMetadata 时,如何获取 ContainerMetadata 的 PropertyName?

问题描述

我有一个在 ASP.NET Core 5 框架之上使用 C# 编写的项目。

我正在尝试使用 Razor 引擎手动呈现 ModelMetadata 内容ModelMetadata 为我提供了一个名为 ContainerMetadata属性,在父 ModelMetadata 上找到复杂类型属性的情况下,它告诉我有关父 ModelMetadata 的信息。

但是,PropertyName 上的 ContinerMetadata 属性始终为 null。

我有以下视图模型。使用 Mainviewmodel 方法View() 波纹管从控制器传递到视图。

public class Mainviewmodel
{
    public int ID { get; set; }

    public class Cellviewmodel { get; set; }
}

public class Cellviewmodel
{
    public string Name { get; set; }
}

现在在剃刀视图中,我使用 ModelMetadata

访问传递模型的 Html.ViewData.ModelMetadata

我的目标是能够使用扩展方法手动呈现 HTML。为了获取我想要呈现的每个属性ModelMetadata,我使用以下函数

public static IHtmlContent GetHtml(this IHtmlHelper html,ModelMetadata Metadata)
{
    HtmlContentBuilder code = new HtmlContentBuilder();

    IEnumerable<ModelMetadata> elements = Metadata.Properties.Where(Metadata => Metadata.ShowFordisplay);

    foreach(ModelMetadata element in elements)
    {
        if(element.IsClass) 
        {   
            // When this code is called,each proeprty on the element.ModelType has ContainerModelMetadata which is element
            // However,when I access ContainerModelMetadata.PropertyName I get null.
            var subCode = html.GetHtml(element);

            code.AppendHtml(subCode);

            continue;
        }

        code.AppendHtml(html.Editor(element.propertyName));
    }

    return code;
}

正如您在上面的评论中看到的,我似乎无法访问父级的属性名称

所以解决这个问题,我每次都可以像这样传递父

public static IHtmlContent GetHtml(this IHtmlHelper html,ModelMetadata Metadata,string parentName = null)
{
    HtmlContentBuilder code = new HtmlContentBuilder();

    IEnumerable<ModelMetadata> elements = Metadata.Properties.Where(Metadata => Metadata.ShowFordisplay);

    foreach(ModelMetadata element in elements)
    {
        if(element.IsClass) 
        {   
            // When this code is called,when I access ContainerModelMetadata.PropertyName I get null.
            var subCode = html.GetHtml(element,element.Name);

            code.AppendHtml(subCode);

            continue;
        }

        string expression = element.propertyName;

        if(!string.IsNullOrEmpty(parentName)) 
        {
            expression = $"{parentName}.{element.PropertyName}";
        }

        code.AppendHtml(html.Editor(expression));
    }

    return code;
}

如上所示,我必须将 parentName 传递到每个级别,以便获得正确的表达式。这里的问题是在我的代码中,我有更深的层次,这需要我将 parentName 传递给每个函数。我希望避免除了 parentName 之外还必须同时传递属性的 ModelMetadata。我希望能够从给定的 ModelMetadata获取 parentName,因为我已经有了 ContainerModelMetadata

PropertyName 不为 null 时,如何从 ContinerMetadata 正确访问 ContinerMetadata 的值?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)