【问题标题】:How to add TipAttribute to Model for MVC3如何将 TipAttribute 添加到 MVC3 模型
【发布时间】:2011-12-14 15:14:10
【问题描述】:

我想创建一个新属性 TipAttribute,我可以使用它来向我的用户显示有用的提示。

public class EditPersonModel {
    [Display(Name = "Full Name")]
    [Tip(Message = "Enter the person's full name.")]
    public string Name { get; set; }
}

所以在我看来我会这样做

<div class="editor-field">
    @Html.InputFor(m => m.Name)
    @Html.TipFor(m => m.Name)
</div>

它会渲染

<div class="editor-field">
    <input id="Name" name="Name" type="text" value="">
    <div class="tip">Enter the person's full name.</div>
</div>

我知道我需要为 HtmlHelper 编写一个 Extension 方法,但我不知道里面应该写什么!

public static MvcHtmlString TipFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) {
    ???
}

我已经开始研究 Mvc3 源代码中 DisplayAttribute 的实现,但它非常复杂,看起来提供我自己的自定义属性并不容易/可插入。是否有标准的 MVC3 方式来执行此操作?

谢谢!

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    假设您的 tip 属性已识别元数据:

    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());
        }
    }
    

    【讨论】:

    • 太棒了!我还没有测试过,但这很有意义,这就是我所希望的……像 IMetadataAware 这样的系统,可以让我扩展内置的 Lambda 解析器。
    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 2011-12-27
    • 1970-01-01
    • 2012-03-02
    • 2015-06-23
    • 2023-03-27
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多