2009-02-13 44 views
9

Tôi có một vấn đề lạ trong đó ValidationSummary không được hiển thị. Tuy nhiên, ValidationMessage đang được hiển thị. Tôi đã kiểm tra các nguồn trang đầu ra và nó không phải là mặc dù họ đang ở trong một màu sắc mà che khuất chúng. Tôi đang sử dụng RC. Bất kỳ ý tưởng?asp.net MVC - ValidationSummary không hiển thị

Edit: điểm break đặt ở ValidationSummary cho thấy:

ViewData.ModelState.Values[1].ErrorMessage = "" 
ViewData.ModelState.Values[1].Exception.InnerException.Message = "4a is not a valid value for Int32" 

Liệu ValidationSummary sử dụng ErrorMessage và ValidationMessage sử dụng InnerException.Message?

xem mã của tôi là:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<App.Models.PurchaseOrdersView>" %> 


<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
    <title>Edit</title> 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2>Edit</h2> 

    <%= Html.ValidationSummary() %> 

    <% Html.BeginForm("Edit", "PurchaseOrder", FormMethod.Post); %> 
    <table> 
     <tr> 
      <td> 
       Purchase Order Id: 
      </td> 
      <td> 
       <%= Html.TextBox("PurchaseOrderId", Model.PurchaseOrderId)%> 
       <%= Html.ValidationMessage("PurchaseOrderId")%> 
      </td> 
     </tr> 
     <tr> 
      <td> 
       Date: 
      </td> 
      <td> 
       <%= Html.TextBox("Date", Model.Date.ToString("dd-MMM-yyyy"))%> 
       <%= Html.ValidationMessage("Date")%> 
      </td> 
     </tr> 
    </table> 
    <input type="submit" value="Save" /> 

    <% Html.EndForm(); %> 

</asp:Content> 

Trả lời

6

Bạn không nói những sai sót được mà không hiển thị, nhưng có một số lỗi sẽ được hiển thị trong ValidationMessage nhưng không phải trong ValidationSummary. Tôi nghĩ rằng đây là một lỗi trong Ứng cử viên Phát hành, nhưng tôi mở cửa cho các giải thích khác. Cụ thể, hãy xem xét dòng này từ mã nguồn ValidationSummary:

string errorText = GetUserErrorMessageOrDefault(modelError, null /* modelState */); 

Lưu ý rằng không có gì được chuyển cho modelState. Bây giờ tương phản mà với ValidationMessage:

... GetUserErrorMessageOrDefault(modelError, modelState) ... 

Cuối cùng, chúng ta hãy nhìn vào GetUserErrorMessageOrDefault:

private static string GetUserErrorMessageOrDefault(ModelError error, ModelState modelState) { 
     if (!String.IsNullOrEmpty(error.ErrorMessage)) { 
      return error.ErrorMessage; 
     } 
     if (modelState == null) { 
      return null; 
     } 

     string attemptedValue = (modelState.Value != null) ? modelState.Value.AttemptedValue : null; 
     return String.Format(CultureInfo.CurrentCulture, MvcResources.Common_ValueNotValidForProperty, attemptedValue); 
    } 

Điều này cho chúng ta biết là nếu bạn chỉ định một thông báo lỗi tùy chỉnh khi bạn thêm một lỗi sang trạng thái mô hình, nó sẽ được hiển thị. Nếu, tuy nhiên, một ngoại lệ được thêm vào (có một quá tải cho AddModelError mà có một ngoại lệ, khác mà mất một chuỗi; thực hiện IDataErrorInfo hoạt động như trường hợp chuỗi), thay vì một thông báo lỗi chuỗi, nó sẽ chỉ được hiển thị nếu modelState là không rỗng, và sau đó chúng tôi sẽ cung cấp cho bạn một thông báo chung thay vì thông báo lỗi về ngoại lệ.

Cập nhật

Liệu ValidationSummary sử dụng ErrorMessage và ValidationMessage sử dụng InnerException.Message?

Có, đó là nhiều hay ít hiệu ứng. Như tôi đã nói, tôi nghĩ đây là một lỗi.

Update2

Microsoft cập nhật chức năng GetUserErrorMessageOrDefault như đã thấy here.

private static string GetUserErrorMessageOrDefault(HttpContextBase httpContext, ModelError error, ModelState modelState) 
    { 
     if (!String.IsNullOrEmpty(error.ErrorMessage)) 
     { 
      return error.ErrorMessage; 
     } 
     if (modelState == null) 
     { 
      return null; 
     } 

     string attemptedValue = (modelState.Value != null) ? modelState.Value.AttemptedValue : null; 
     return String.Format(CultureInfo.CurrentCulture, GetInvalidPropertyValueResource(httpContext), attemptedValue); 
    } 
+0

Hi Craig: Đối với PurchaseOrderId (số nguyên) và ngày (ngày) tôi bước vào chuỗi. Tôi đã thử với/không có thông báo lỗi tùy chỉnh. Tôi sử dụng UpdateModel để nhận thêm lỗi. Tôi là một n00b và tôi chỉ là về cam kết những gì bạn đang nói. Tôi đã cập nhật câu hỏi của mình với một chút thông tin. –

+0

Xin chào, tôi cũng nghĩ rằng đây là lỗi vì tóm tắt xác thực của tôi không hiển thị tất cả các lỗi nhưng thông báo xác thực nội tuyến của tôi là. Tôi nghĩ rằng lỗi này đã được giới thiệu trong MVC2 RC2. – Naz

+1

Liên kết thay đổi của Microsoft với GetUserErrorMessageOrDefault dường như bị hỏng. Liên kết này sẽ hoạt động: http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/f1511797ea32#src/System.Web.Mvc/Html/ValidationExtensions.cs – Jay

11

Hãy thử

<%= Html.ValidationSummary(false) %> 
+2

Tham số là "excludePropertyErrors". Vì vậy, thiết lập này để sai đảm bảo các lỗi tài sản được bao gồm trong bản tóm tắt. – AaronLS

Các vấn đề liên quan