2012-10-24 28 views
0

我已經在我此刻的觀點如下:在ASP.NET.MVC擴展Html.TextBoxFor和Html.PasswordFor顯示工具提示,而不是validaton

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

請注意:這不是應該表現出基於輸入/隱藏驗證消息,把它想成幫助文本。

+0

我會通過jQuery來做到這一點。 jQuery UI剛發佈了一個支持tooltip的新版本。請參閱http://jqueryui.com/tooltip/ – user1477388

+0

這與今天的另一個SO問題密切相關。 http://stackoverflow.com/questions/13052836/set-html-attributes-with-data-annotation – jessegavin

+0

爲什麼密碼工具提示必須是密碼屬性的成員?你不能直接在模型上創建一個model.PasswordTooltip屬性嗎?您可能希望在Resource Resx文件中添加類似以下的內容以供將來本地化。 –

回答

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。

+0

很好的答案。一件小事。我認爲在你的例子中'objectsAsDict'應該是'htmlAttributes'。 – jessegavin

+0

謝謝 - 你是對的,我編輯了我的答案。 – StanK