2012-12-03 22 views
2

我一直在爲MVC創建自定義錯誤驗證消息,該消息顯示錯誤消息jQueryUI樣式。自定義JQueryUI ValidationMessageFor隱藏驗證擴展方法

看起來很酷,但我需要在沒有錯誤信息時隱藏整個div ......我該怎麼做?

這裏是我的HTML輔助擴展方法:

public static MvcHtmlString MyValidationMessageFor<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) 
     {    
       TagBuilder widgetDiv = new TagBuilder("div"); 
       widgetDiv.AddCssClass("ui-widget"); 
       widgetDiv.Attributes.Add("style", "font-size: 10px"); 

       TagBuilder errorDiv = new TagBuilder("div"); 
       errorDiv.AddCssClass("ui-state-error ui-corner-all"); 
       errorDiv.Attributes.Add("style", "padding:0 .7em;"); 

       TagBuilder paragraph = new TagBuilder("p"); 

       TagBuilder span = new TagBuilder("span"); 
       span.AddCssClass("ui-icon ui-icon-alert"); 
       span.Attributes.Add("style", "float: left; margin-right: .3em;"); 

       TagBuilder strong = new TagBuilder("strong"); 
       strong.InnerHtml = "Alert: "; 

       paragraph.InnerHtml += span.ToString(TagRenderMode.Normal); 
       paragraph.InnerHtml += strong.ToString(TagRenderMode.Normal); 
       paragraph.InnerHtml += helper.ValidationMessageFor(expression).ToString();   

       errorDiv.InnerHtml += paragraph.ToString(TagRenderMode.Normal); 

       widgetDiv.InnerHtml += errorDiv.ToString(TagRenderMode.Normal);        

       return MvcHtmlString.Create(widgetDiv.ToString(TagRenderMode.Normal));    
     } 

這裏是它產生的HTML:我假設我需要根據一些條件返回一個空字符串

<div class="ui-widget"> 
    <div class="ui-state-error ui-corner-all" style="padding: 0 .7em;"> 
     <p><span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span> 
     <strong>Alert:</strong> Sample ui-state-error style.</p> 
    </div> 
</div> 

。 ..我該怎麼做呢?

編輯:添加圖片來說明問題 - div顯示空文本無論如何。

Alert!

EDIT2:我注意到,在調試該方法時,只打了一次...也許不顯眼的驗證問題。

此代碼並沒有幫助:

string propertyName = ExpressionHelper.GetExpressionText(expression); 
string name = helper.AttributeEncode(helper.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName)); 

if (helper.ViewData.ModelState[name] == null || 
    helper.ViewData.ModelState[name].Errors == null || 
    helper.ViewData.ModelState[name].Errors.Count == 0) 
{ 
    return MvcHtmlString.Empty; 
} 

回答

0

爲什麼不能做一個測試的驗證消息構造的HTML塊之前?如果它是空的,那麼沒有錯誤。

var validationMessage = helper.ValidationMessageFor(expression).ToString(); 
if (!string.IsNullOrEmpty(validationMessage)) 
{ 
    // Build your message as in your code. 
} 
+0

validationMessage == 「<跨度類= \」 字段驗證-有效\ 「數據valmsg換= \ 」用戶名\「 數據valmsg替換= \ 」真\「>」,使將無法工作。我也注意到,該方法的斷點只有一次(我使用不顯眼的驗證)...也許它不可能通過擴展方法。 – woggles

+0

那麼,如果你得到一個空的跨度,你可以很容易地用正則表達式來檢查。雖然它不是很優雅,但是... –

+0

我做了一些家庭作業......如果你有一個「Pro ASP.NET MVC 3框架」的副本,從第636頁開始,它解釋瞭如何去做你正在做的事情。這是一個很好的工作,涉及到創建自定義屬性來實現'IClientValidatable'並使用jQuery來處理它們。然而,這是相當多的工作,從架構的角度來看,每個消息的自定義屬性可能是不受歡迎的。您是否可以通過更改內置驗證消息的CSS來對消息進行更改? –