在ASP.NET.MVC中扩展Html.TextBoxFor和Html.PasswordFor以显示工具提示,而不是用于验证

时间:2012-10-24 19:17:35

标签: asp.net-mvc asp.net-mvc-3

目前我的观点中有以下内容:

@Html.PasswordFor(m => m.Password, new { Title = "Passwords must be at least 6 characters long" })

工作得很好,但是在我身上唠叨的是,能够将视图模型中的工具提示作为属性真的很棒,因为所有其他信息都存在,并且将它放入我的看起来很麻烦图。

有没有办法可以提取属性的值,以便我的代码类似于:

@Html.PasswordFor(m => m.Password, new { Title = m.Password.Tooltip })

请注意:它不是应根据输入显示/隐藏的验证消息,将其视为帮助文本。

1 个答案:

答案 0 :(得分:2)

您可以创建自己的属性,为模型元数据添加工具提示,然后使用自定义帮助方法呈现相应的html。

e.g。

属性

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class ToolTipAttribute : Attribute, IMetadataAware
{
    public string Message { get; set; }

    public ToolTipAttribute(string message)
    {
        Message = message;
    }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues["ToolTip"] = Message;
    }
}

助手方法

public static MvcHtmlString PasswordForWithToolTip<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper,
                                                                 Expression<Func<TModel, TEnum>> expression)
{
    var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    var htmlAttributes = new Dictionary<string, object>();
    if (metadata.AdditionalValues.ContainsKey("ToolTip"))
    {
        var toolTip = metadata.AdditionalValues["ToolTip"] as string;

        if (!string.IsNullOrEmpty(toolTip))
                htmlAttributes.Add("title", toolTip);
    }

    return htmlHelper.PasswordFor(expression, htmlAttributes);
}

然后,使用ToolTip属性装饰您的属性,并使用@Html.PasswordFor WithToolTip( x => x.Password),它应该呈现相应的HTML。