Asp.net mvc 3 如何向MVC3的模型中添加TipAttribute

Asp.net mvc 3 如何向MVC3的模型中添加TipAttribute,asp.net-mvc-3,Asp.net Mvc 3,我想创建一个新的属性TipAttribute,用于向用户显示有用的提示 公共类EditPersonModel{ [显示(Name=“全名”)] [提示(Message=“输入此人的全名”。)] 公共字符串名称{get;set;} } 所以在我看来我会这样做 @InputFor(m=>m.Name) @Html.TipFor(m=>m.Name) 而且它会 输入此人的全名。 我知道我需要为HtmlHelper编写一个扩展方法,但我不知道里面应该写什么 public static MvcH

我想创建一个新的属性TipAttribute,用于向用户显示有用的提示

公共类EditPersonModel{
[显示(Name=“全名”)]
[提示(Message=“输入此人的全名”。)]
公共字符串名称{get;set;}
}
所以在我看来我会这样做


@InputFor(m=>m.Name)
@Html.TipFor(m=>m.Name)
而且它会


输入此人的全名。
我知道我需要为HtmlHelper编写一个扩展方法,但我不知道里面应该写什么

public static MvcHtmlString TipFor(此HtmlHelper HtmlHelper,表达式){
???
}
我已经开始研究Mvc3源代码中DisplayAttribute的实现,但它非常复杂,而且提供我自己的自定义属性看起来并不容易/可插入。有没有标准的MVC3方法可以做到这一点


谢谢大家!

假设您的提示属性具有元数据意识:

public class TipAttribute: Attribute, IMetadataAware
{
    public string Message { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["tip"] = Message;
    }
}
你可以:

public static class HtmlExtensions
{
    public static IHtmlString TipFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper, 
        Expression<Func<TModel, TProperty>> expression
    ) 
    {
        var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        var tip = metaData.AdditionalValues["tip"] as string;
        var div = new TagBuilder("div");
        div.AddCssClass("tip");
        div.SetInnerText(tip ?? string.Empty);
        return new HtmlString(div.ToString());
    }
}
public静态类
{
公共静态IHtmlString TipFor(
这个HtmlHelper HtmlHelper,
表情
) 
{
var metaData=modelmetada.FromLambdaExpression(表达式,htmlHelper.ViewData);
var tip=metaData.AdditionalValues[“tip”]作为字符串;
var div=新标记生成器(“div”);
分区AddCssClass(“tip”);
div.SetInnerText(提示??string.Empty);
返回新的HtmlString(div.ToString());
}
}

假设您的提示属性具有元数据意识:

public class TipAttribute: Attribute, IMetadataAware
{
    public string Message { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["tip"] = Message;
    }
}
你可以:

public static class HtmlExtensions
{
    public static IHtmlString TipFor<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper, 
        Expression<Func<TModel, TProperty>> expression
    ) 
    {
        var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        var tip = metaData.AdditionalValues["tip"] as string;
        var div = new TagBuilder("div");
        div.AddCssClass("tip");
        div.SetInnerText(tip ?? string.Empty);
        return new HtmlString(div.ToString());
    }
}
public静态类
{
公共静态IHtmlString TipFor(
这个HtmlHelper HtmlHelper,
表情
) 
{
var metaData=modelmetada.FromLambdaExpression(表达式,htmlHelper.ViewData);
var tip=metaData.AdditionalValues[“tip”]作为字符串;
var div=新标记生成器(“div”);
分区AddCssClass(“tip”);
div.SetInnerText(提示??string.Empty);
返回新的HtmlString(div.ToString());
}
}

太棒了!我还没有测试,但这很有道理,这就是我所希望的。。。像IMetadataAware这样的系统让我可以扩展内置的Lambda解析器。太棒了!我还没有测试,但这很有道理,这就是我所希望的。。。像IMetadataAware这样的系统可以让我扩展内置的Lambda解析器。