首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ModelMetadata.FromStringExpression不适用于嵌套属性

ModelMetadata.FromStringExpression不适用于嵌套属性
EN

Stack Overflow用户
提问于 2013-08-09 18:12:43
回答 1查看 868关注 0票数 4

我的模型中有一个包含一些元数据的复杂类型;

代码语言:javascript
复制
[ComplexType]    
public class ComplexModel
{
    [Display("Name Label")]
    public string Name { get; set; }
}

public class MainModel
{
    // ...

    public ComplextModel ComplexModel { get; set; }
}

这段代码可以正常工作;

代码语言:javascript
复制
Html.DisplayFor(model => model.ComplexModel.Name)

但这一次不是;

代码语言:javascript
复制
Html.Display("ComplexModel.Name")

甚至我走得更远,找出问题所在,这就是ModelMetadata.FromStringExpression

ModelMetadata.FromStringExpression("ComplexModel.Name", viewData)返回错误结果。当ModelMetadata.FromLambdaExpression(expression, viewData)正常工作时。

这是个bug吗?

我只想让Html.Display("ComplexModel.Name")正常工作,并在本例中返回"Name Label“。

EN

回答 1

Stack Overflow用户

发布于 2015-05-19 16:37:30

您必须创建一个使用新模型或新ViewData的新自定义HtmlHelper类,因此:

代码语言:javascript
复制
public static class CustomHtmlHelperExtensions
{
    public static HtmlHelper CustomHtmlHelper(this HtmlHelper helper, Object model)
    {
        ViewDataDictionary customViewData = new ViewDataDictionary(helper.ViewData) { Model = model };
        ViewDataContainer customViewDataContainer = new ViewDataContainer(customViewData);
        ViewContext customViewContext =
            new ViewContext(helper.ViewContext.Controller.ControllerContext, helper.ViewContext.View, customViewData, helper.ViewContext.TempData, helper.ViewContext.Writer);

        return new HtmlHelper(customViewContext, customViewDataContainer, helper.RouteCollection);

    }


    private class ViewDataContainer : IViewDataContainer
    {
        public ViewDataDictionary ViewData { get; set; }

        public ViewDataContainer(ViewDataDictionary viewData)
        {
            ViewData = viewData;
        }
    }

}

然后,您可以编写自己的显示自定义帮助器,或者像这样使用显示帮助器:

代码语言:javascript
复制
@Html.CustomHtmlHelper(Model.ComplexModel).Display("Name");

对于“姓名标签”,使用DisplayName:

代码语言:javascript
复制
@Html.CustomHtmlHelper(Model.ComplexModel).DisplayName("Name);

直接与@Html一起使用的自定义显示方法:

代码语言:javascript
复制
public static class CustomDisplayHelper
{
    public static MvcHtmlString CustomDisplay(this HtmlHelper helper, string expression, Object model)
    {
        HtmlHelper customHelper = helper.CustomHtmlHelper(model);
        return customHelper.Display(expression);
    }

    public static MvcHtmlString CustomDisplayName(this HtmlHelper helper, string expression, Object model)
    {
        HtmlHelper customHelper = helper.CustomHtmlHelper(model);
        return customHelper.DisplayName(expression);
    }
}

代码语言:javascript
复制
@Html.CustomDisplay("Name", Model.ComplexModel)
@Html.CustomDisplayName("Name", Model.ComplexModel)

如果您想使用ModelMetadata.FromStringExpression来获取"Name Lable“,代码如下所示:

代码语言:javascript
复制
ViewDataDictionary myViewData = new ViewDataDictionary(Model.ComplexModel); 
ModelMetadata metadata ModelMetadata.FromStringExpression("Name", MyViewData); 

并获取显示名称或任何其他属性:

代码语言:javascript
复制
String displayName = metadata.DisplayName; 

或者更好的方式:

代码语言:javascript
复制
String displayName = metadata.GetDisplayName;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18144396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档