ASP.net MVC嵌套模型显示名称

时间:2014-12-12 09:09:21

标签: c# asp.net-mvc asp.net-mvc-5

我的模型如下:

型号:

public class Farm
{
    public Animal Cow1 {get;set;}
    public Animal Pig1 {get;set;} 
}

public class Animal
{
    [DisplayName("Animal Name")]
    public string Name {get;set;}
}

查看:

@Html.LabelFor(m => m.Cow1.Name)
@Html.LabelFor(m => m.Pig1.Name)

我的问题是:

而不是"动物名称",我希望Cow1的名字标签是" Cow Name"和Pig1的名称标签为" Pig Name"。

有可能这样做吗?感谢。


感谢@devqon,这个建议可以解决我的问题。然而,我可以从属性中询问更多关于这样做吗?如下所示,是否存在类似属性" DisplayMetaData "表现?

public class Farm
{
    [DisplayMetaData(typeof(CowMetaData))]
    public Animal Cow1 {get;set;}

    [DisplayMetaData(typeof(PigMetaData))]
    public Animal Pig1 {get;set;} 
}

public class Animal
{
    [DisplayName("Animal Name")]
    public string Name {get;set;}
}

public class CowMetaData
{
    [DisplayName("Cow Name")]
    public string Name {get;set;}
}

public class PigMetaData
{
    [DisplayName("Pig Name")]
    public string Name {get;set;}
}

我希望代码的编写方式与我们使用属性[ MetadataType ]的方式一样,MetaData是在单独的类中定义的,并且显示名称仍然可以由HtmlHelper LabelFor函数。但是[MetadataType]仅用于类而不是属性,所以我想出了这个问题。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

你能否修改你的类来实现继承来解决问题?例如:

public abstract class Animal
{
    public abstract string Name { get; set; }
}

public class Cow : Animal
{
    [Display(Name="Cow Name")]
    public override string Name { get; set; }
}

public class Pig : Animal
{
    [Display(Name = "Pig Name")]
    public override string Name { get; set; }
}

public class Farm
{
    public Cow Cow { get; set; }
    public Pig Pig { get; set; }
}

答案 1 :(得分:0)

我认为这是合理的:

public class Farm
{
    [DisplayName("Cow")]
    public Animal Cow1 {get;set;}

    [DisplayName("Pig")]
    public Animal Pig1 {get;set;} 
}

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

并在cshtml中使用它(我知道asp能够自动执行此操作):

@Html.LabelFor(m => m.Cow1) @Html.LabelFor(m => m.Cow1.Name)