0

目前我的观点如下:

@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 })

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

4

1 回答 1

2

您可以创建自己的属性,将工具提示添加到模型元数据,然后让自定义帮助器方法呈现适当的 html。

例如

属性

[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。

于 2012-10-24T21:37:52.507 回答