Validation 想知道为什么在覆盖属性的LabelFor中忽略DisplayName属性吗

Validation 想知道为什么在覆盖属性的LabelFor中忽略DisplayName属性吗,validation,asp.net-mvc-2,attributes,Validation,Asp.net Mvc 2,Attributes,今天我在ASP.NET MVC 2中做了两个m.MyProperty)%%>并使用System.ComponentModel中的[DisplayName(“Show this代替MyProperty”)]属性时感到困惑 事实证明,当我将属性放在重写属性上时,LabelFor似乎没有注意到它。 但是,[Required]属性在重写的属性上运行良好,生成的errormessage实际上使用DisplayNameAttribute 这是一些简单的示例代码,更现实的情况是,我有一个独立于viewmode

今天我在ASP.NET MVC 2中做了两个
m.MyProperty)%%>
并使用
System.ComponentModel
中的
[DisplayName(“Show this代替MyProperty”)]
属性时感到困惑

事实证明,当我将属性放在重写属性上时,LabelFor似乎没有注意到它。
但是,
[Required]
属性在重写的属性上运行良好,生成的errormessage实际上使用DisplayNameAttribute

这是一些简单的示例代码,更现实的情况是,我有一个独立于viewmodel的databasemodel,但为了方便起见,我想从databasemodel继承,添加仅视图的属性,并用UI的属性装饰viewmodel

public class POCOWithoutDataAnnotations
{
    public virtual string PleaseOverrideMe { get; set; }        
} 
public class EditModel : POCOWithoutDataAnnotations
{
    [Required]
    [DisplayName("This should be as label for please override me!")]
    public override string PleaseOverrideMe 
    {
        get { return base.PleaseOverrideMe; }
        set { base.PleaseOverrideMe = value; }
    }

    [Required]
    [DisplayName("This property exists only in EditModel")]
    public string NonOverriddenProp { get; set; }
}
强类型的
ViewPage
包含:

        <div class="editor-label">
            <%= Html.LabelFor(model => model.PleaseOverrideMe) %>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.PleaseOverrideMe) %>
            <%= Html.ValidationMessageFor(model => model.PleaseOverrideMe) %>
        </div>

        <div class="editor-label">
            <%= Html.LabelFor(model => model.NonOverriddenProp) %>
        </div>
        <div class="editor-field">
            <%= Html.TextBoxFor(model => model.NonOverriddenProp) %>
            <%= Html.ValidationMessageFor(model => model.NonOverriddenProp) %>
        </div>
model.PleaseOverrideMe)%%>
实际上使用了
[DisplayName(“这应该是请覆盖我的标签!”)]
属性,并生成默认错误文本“这应该是请覆盖我的标签!”字段是必需的


一些友好的灵魂会对此有所启发吗?

。我认为这是一个bug,但显然MVC团队不同意我的观点,因为我的连接问题被关闭为“按设计”。

当我对接口强类型化的部分视图时,我遇到了同样的问题。接口定义了一个

DisplayName
,实现该接口的类试图重写它。我发现让它尊重重写的唯一方法是键入实现类。我必须更改视图的模型类型或强制转换。不幸的是,这完全否定了将接口用作模型类型的好处。我猜我最终会为每个实现类提供某种级别的重复视图标记,而不是在强类型“helpers”中强制转换

这种解决方法很有可能对我有一点帮助(我不抱希望),下面是一个例子。对于所有试图重写名称的可能实现类,当然有一些方法可以处理这个问题,但这肯定比它应该做的更麻烦

public interface IAddressModel {
    ...
    [DisplayName("Province")]
    public string Province { get; set; }
    ...
}
public class UsAddressModel : IAddressModel {
    ...
    [DisplayName("State")]
    public string Province { get; set; }
    ...
}

<%= Html.LabelFor(m => m.State) %> <!--"Province"-->
<%= Html.LabelFor(m => (m as UsAddressModel).State) %> <!--"State"-->
公共接口模型{
...
[显示名称(“省”)]
公共字符串省{get;set;}
...
}
公共类USADDRESMODEL:IADDESMODEL{
...
[显示名称(“状态”)]
公共字符串省{get;set;}
...
}
m、 国家)%>
(m作为USADDRESMODEL)。状态)%>

我使用[DisplayName(“Profile Name”)]遇到了这个问题,而使用了
[Display(Name=“Profile Name”)]
解决了我的问题。我不确定这是否有用


前者来自
System.ComponentModel
,而后者来自
System.ComponentModel.DataAnnotations

好的,如果您不使用所需的标记,我似乎找到了解决方法!只需使用正则表达式或length属性来确定是否存在有效条目。希望这能有所帮助,尽管有点晚了

[RegularExpression(@"^[1-9][0-9][0-9]$")]   //validates that there is at least 1 in the quantity and no more than 999
[DisplayName("Quantity:")]
public string quantity { get; set; }

仍然有效。

在我的例子中,我忘记了使用getter和setter将其作为属性。 而不是

public string CompanyName;
我应该用

public string CompanyName {get;set;}

好吧,我会尝试将它作为bug@Connect归档,然后准备好“按设计”。谢谢不是虫子?我把我的整个项目转移到MVC3上,这让我很痛苦。它过去工作得很好-DisplayName属性现在不应该以这种方式工作吗?那么,当您覆盖编辑/显示对象模板并使用
Html.EditorForModel
时会发生什么情况?在模板中,您使用
Html.Label()
,但无法获取显示属性。是故意的吗?他们从IE团队中雇佣了白痴吗?.Lasse,在这期间你运气好吗?如果你使用反射来显示你的所有属性,你就可以使用
ModelMetadata
类型。基本上,您可以这样做
Html.Label(prop.GetDisplayName())
。六年后,这解决了MVC5:)+seven中的相同问题。固定在核心mvc拇指向上
public string CompanyName {get;set;}