2012-08-24 69 views
30

我在使用ValidationSummary(true)顯示模型級錯誤時遇到了一個小問題。如果ModelState不包含模型錯誤(即ModelState.AddModelError("", "Error Description"))但包含屬性錯誤(使用數據註釋添加),則它將顯示驗證摘要且沒有錯誤信息(當您查看源時)。如果沒有屬性錯誤,那麼不顯示驗證摘要爲什麼ValidationSummary(true)顯示屬性錯誤的空白摘要?

enter image description here

:我的CSS因此顯示一個空的紅盒子,像這樣。有ValidationSummary(true)我希望它只顯示驗證錯誤,如果有模型錯誤。我誤解了什麼?

我有一個基本的項目如下:

控制器:

public class HomeController : Controller 
{ 
    public ViewResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Index(IndexViewModel model) 
    { 
     return View(); 
    } 
} 

型號:

public class IndexViewModel 
{ 
    [Required] 
    public string Name { get; set; } 
} 

查看:

@model IndexViewModel 

@Html.ValidationSummary(true) 

@using(@Html.BeginForm()) 
{ 
    @Html.TextBoxFor(m => m.Name) 
    <input type="submit" value="submit" /> 
} 
+0

也要注意這個http://stackoverflow.com/questions/2818219/asp-net-mvc-html-validationsummarytrue-does-not-display-model-errors – maulik13

回答

24

我認爲ValidationSummary輔助方法有問題。您可以輕鬆創建一個自定義幫助程序方法,以包裝內置的ValidationSummary

public static MvcHtmlString CustomValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors) 
{ 
    var htmlString = htmlHelper.ValidationSummary(excludePropertyErrors); 

    if (htmlString != null) 
    { 
    XElement xEl = XElement.Parse(htmlString.ToHtmlString()); 

    var lis = xEl.Element("ul").Elements("li"); 

    if (lis.Count() == 1 && lis.First().Value == "") 
     return null; 
    } 

    return htmlString; 
} 
從您的視圖

然後,

@Html.CustomValidationSummary(true) 
+3

看來這也是一個問題,目前我有MVC4嗎?我決定在最後使用這個解決方案,工作正常。謝謝你的幫助。 – Dangerous

2

我知道解決方法已經找到,但我有簡單的解決方案類似的問題。

是您的驗證摘要渲染與CSS類「驗證,彙總有效」或「驗證,彙總錯誤」?第一類應用於驗證摘要爲空,第二類在填充時應用。

我注意到,如果驗證摘要不包含錯誤,則呈現佔位符div,因此如果任何字段未通過驗證,則客戶端驗證可以顯示它。

在默認的MVC樣式表'Site.css'中,他們只是用'display:none'來禁止顯示空的驗證摘要。 例如.validation-summary-valid {display:none; }

+1

這是不正確的。如果有任何錯誤(無論是在模型級別還是屬性級別),總是應用「validation-summary-errors」類。 'validation-summary-valid'只適用於沒有錯誤的情況。因此,如果您正在使用'Html.ValidationSummary(true)'和空'div'類,那麼即使只有屬性級錯誤和模型級錯誤,也會添加「validation-summary-errors」。 (我們與登錄表單有相同的情況,我們使用*模型級別或屬性級別的錯誤消息,而不是兩者。 – Chris

5

做的另一種方法是檢查是否有任何li元素,如果不只是隱藏驗證,彙總錯誤

<script type="text/javascript"> 
    $(document).ready(function() { 
      if ($(".validation-summary-errors li:visible").length === 0) { 
       $(".validation-summary-errors").hide(); 
      } 
    }); 
</script> 
+0

簡短,快速到+1 +1 –

15

檢查this問題了。

你可以用CSS 隱藏摘要:

.validation-summary-valid { display:none; } 

而且,你可以把驗證總結Html.BeginForm()之前。

+0

爲我工作... thanx :) –

31
@if (ViewContext.ViewData.ModelState.Where(x => x.Key == "").Any()) 
{ 
    @Html.ValidationSummary(true, null, new { @class = "ui-state-error" }) 
} 

這檢查是否有任何模型範圍的錯誤,並只有當有一些時,呈現總結。

+1

我認爲一個自定義幫手(如在接受答案),但使用這種條件檢查會更好 - 現在我剛剛使用這個內聯。爲了節省一些輸入,你可以使用下面的代碼:@if(ViewData.ModelState.Any(_ => _.Key == string.Empty)){...}。我總是更喜歡使用string.Empty而不是「」,因爲它顯示了明確的意圖,因爲在輸入時額外的努力,而「」可能只是被某人追蹤並忘記返回並填充它。 – Peter

+5

而不是枚舉使用'Any'的鍵,可以直接使用'ContainsKey':'if(ViewContext.ViewData.ModelState.ContainsKey(string.Empty))' –

1

與自舉類修復的另一個變化是:

public static class ValidationSummaryExtensions 
{ 
    public static MvcHtmlString CleanValidationSummary(this HtmlHelper htmlHelper, bool excludePropertyErrors, string message = null) 
    { 
     if(htmlHelper == null) throw new ArgumentNullException("htmlHelper"); 

     MvcHtmlString validationSummary = null; 
     if (htmlHelper.ViewData.ModelState.ContainsKey(string.Empty)) 
     { 
      var htmlAttributes = new { @class = "alert alert-danger" }; 
      validationSummary = htmlHelper.ValidationSummary(excludePropertyErrors, message, htmlAttributes); 
     } 

     return validationSummary; 
    } 
} 
-1

這是驗證腳本這樣做。

更改的web.config

<add key="ClientValidationEnabled" value="false" /> 

以下應該

+0

這是不是會禁用整個網站的客戶端驗證腳本?如果我想使用客戶端驗證腳本怎麼辦? – Dangerous

+0

這是一個精確的問題。 HTML。ValidationSummary實際上是渲染錯誤消息......它們存在於HTTP響應流中,但它們不在頁面的最終HTML中。客戶端SCRIPT正在刪除它們,這確實是。多麼搞砸的配置。 – Triynko

0

我是有這個空驗證摘要問題。我只是將excludePropertyErrors設置爲false,並將錯誤添加到驗證摘要中。

我意識到這不一定是在這裏問什麼 - 雖然這確實解決了空的驗證總結問題 - 如果您有這個問題,這是一個選項。

0

@if(ViewContext.ViewData.ModelState.Count> 0)

{

//你的內容

}

會工作般的魅力。

相關問題