Asp.net 无法获取除字符串以外的模型属性的自定义属性

Asp.net 无法获取除字符串以外的模型属性的自定义属性,asp.net,asp.net-mvc-3,Asp.net,Asp.net Mvc 3,我有这样一个模型(为了相关性而简化): public abstract class TitleCreateModel : ICreateModel { [Required] [MaxLength(400)] public string TitleName { get; set; } [Required] [MaxLength(4)] public DateTime ReleaseDate { get; set; } [Required]

我有这样一个模型(为了相关性而简化):

public abstract class TitleCreateModel : ICreateModel
{
    [Required]
    [MaxLength(400)]
    public string TitleName { get; set; }

    [Required]
    [MaxLength(4)]
    public DateTime ReleaseDate { get; set; }

    [Required]
    [MaxLength(5)]
    public string Test { get; set; }

    [Required]
    [MaxLength(2)]
    public int Wut { get; set; }
}
然后我有一个自定义HTML助手类和一个表达式扩展类(都是未桥接的):

公共类InputHelper
{
公共静态HtmlString输入(表达式、字符串id、字符串标签)
{
var req=expression.GetAttribute();
var max=expression.GetAttribute();
var required=“”;
var maxlength=“”;
如果(请求!=null)
{
required=“req”;
}
如果(最大!=null)
{
maxlength=“maxlength=”+最大长度+”;
}
返回新的HtmlString(“+label+”)+
"");
}
}
公共静态类表达式扩展
{
公共静态TatAttribute GetAttribute(此表达式),其中TatAttribute:Attribute
{
var memberExpression=expression.Body作为memberExpression;
if(memberExpression!=null)
{
var attributes=memberExpression.Member.GetCustomAttributes(typeof(tatAttribute),true);
返回属性.Length>0?属性[0]作为TatAttribute:null;
}
返回null;
}
}
在我的Razor脚本中,我进行以下调用:

@(InputHelper.Input<string>(m => Model.Title.TitleName, "titlename", "Title Name"))

@(InputHelper.Input<string>(m => Model.Title.Test, "testfield", "Test Field"))

@(InputHelper.Input<int>(m => Model.Title.Wut, "tester", "Test Field 2"))

@(InputHelper.Input<DateTime>(m => Model.Title.ReleaseDate, "release_year", "Release Year"))
@(InputHelper.Input(m=>Model.Title.TitleName,“TitleName”,“TitleName”))
@(InputHelper.Input(m=>Model.Title.Test,“testfield”,“testfield”))
@(InputHelper.Input(m=>Model.Title.Wut,“tester”,“测试字段2”))
@(InputHelper.Input(m=>Model.Title.ReleaseDate,“发布年”,“发布年”))

出于某种原因,GetAttribute方法只查找TitleName和Test的属性,这两个属性都是TitleCreateModel的字符串属性。它找不到ReleaseDate和Wut的属性,我也不知道为什么

输入
方法中使用的表达式修改为
表达式

public static HtmlString Input<T, TOut>(Expression<Func<T, TOut>> expression, string id, string label)
{
    var req = expression.GetAttribute<T, TOut, RequiredAttribute>();
    var max = expression.GetAttribute<T, TOut, MaxLengthAttribute>();
    var required = "";
    var maxlength = "";
    if(req!=null)
    {
        required = "req";
    }
    if(max!=null)
    {
        maxlength = "maxlength='" + max.Length + "'";
    }
    return new HtmlString("<div class=\"clearfix\"><label for=\""+id+"\">" + label + "</label>" +
                          "<div class=\"input\"><input id=\""+id+"\" class=\""+required+"\" type=\"text\" "+maxlength+"/></div></div>");
}
公共静态HtmlString输入(表达式、字符串id、字符串标签)
{
var req=expression.GetAttribute();
var max=expression.GetAttribute();
var required=“”;
var maxlength=“”;
如果(请求!=null)
{
required=“req”;
}
如果(最大!=null)
{
maxlength=“maxlength=”+最大长度+”;
}
返回新的HtmlString(“+label+”)+
"");
}

对于DateTime和int,表达式不是MemberExpression类型,因为我相信是装箱,所以此行:

var memberExpression = expression.Body as MemberExpression;
将返回空值


关于这个主题有一个很好的问题和答案,它只涉及按照指定将
Func
generic修改为Eranga。

那么,当我在Func中泛化TResult时,为什么它会起作用呢?我对表达式完全不熟悉,这对我来说就像是一个黑魔法。因为你说函数必须返回泛型对象类型,这需要对值类型执行额外的操作,才能将类型作为对象装箱(请参阅),所以表达式包含了额外的步骤。如果使用泛型类型,则不需要显式地将其作为对象返回,该步骤将被删除。这是有效的,但我不知道为什么会这样做。有关于表达式的好资源可以链接到吗?
var memberExpression = expression.Body as MemberExpression;