2010-08-24 19 views
13

Tôi đã cố gắng ghi đè thông báo lỗi khi nhập loại dữ liệu không chính xác trong trường nhập trên biểu mẫu HTML. Ví dụ tôi có mô hình như thế này.thông báo lỗi ghi đè (Giá trị 'xxx' không hợp lệ đối với Độ tuổi) khi nhập loại dữ liệu không chính xác cho trường nhập asp.net mvc

public class Person 
{ 
    public string FirstName {get;set;} 
    public int Age {get;set;} 
} 

Để xem, tôi đặt nhập văn bản cho Độ tuổi để nhận giá trị.

Khi nhập một số chuỗi trong hộp văn bản Độ tuổi như 'kiểm tra' và nhấn nút gửi. tôi đã thông báo lỗi này

Giá trị 'xxx' là không hợp lệ cho Tuổi

Tuy nhiên, tôi muốn thay đổi thông điệp này và thử nhiều cách. Không có gì có hiệu lực giá trị tin nhắn này.

Vui lòng giúp tôi giải quyết vấn đề này.

+2

Để tham khảo trong tương lai, nếu bạn muốn nhận câu trả lời cho câu hỏi của mình trong tương lai, bạn có thể cân nhắc việc đánh dấu câu hỏi của mình là đã trả lời. –

+1

Cảm ơn nhận xét của bạn, tôi đã xem lại câu hỏi của mình và kiểm tra xem câu hỏi có được giải quyết hay không. – embarus

Trả lời

3

Bạn có thể sử dụng DataAnnotations để ghi đè thông báo lỗi mặc định trong MVC, cũng như cung cấp xác thực của riêng bạn cho bất kỳ trường nào bạn cần. Thấy như sau:

http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

http://www.asp.net/mvc/tutorials/validation-with-the-data-annotation-validators-cs

Nếu bạn đang sử dụng EF, bạn sẽ cần phải tạo ra một lớp MetaData ra khỏi lớp học EF được tạo ra và sau đó thêm các chú thích dữ liệu. Phần cuối của bài viết thứ hai bao gồm cách viết các lớp này cho khung thực thể.

Trong trường hợp cụ thể của bạn, bạn sẽ muốn làm một cái gì đó như:

using System.ComponentModel.DataAnnotations; 

public class Person 
{ 
    public string FirstName {get;set;} 

    [Range(0, 110, ErrorMessage = "<your error message>")] 
    public int Age {get;set;} 
} 

CẬP NHẬT tôi đã quên một điều đó là dễ dàng bỏ qua, bạn cần bao gồm các tập tin JS sau cho các chú thích dữ liệu được đón phía khách hàng mà không cần phải làm một bài:

  • MicrosoftAjax.js

  • MicrosfotMvcValidation.js

Những nên được cổ phiếu trong thư mục Scripts của dự án của bạn (nếu bạn đang sử dụng MVC 2), và bạn cần phải bao gồm họ hoặc trên trang của bạn hoặc trên trang chủ của bạn,

<script src="<%= Url.Content("~/Scripts/MicrosoftAjax.js") %>" type="text/javascript"></script> 
<script src="<%= Url.Content("~/Scripts/MicrosoftMvcValidation.js") %>" type="text/javascript"></script> 

bạn cũng sẽ cần phải bao gồm

<% Html.EnableClientValidation(); %>

trên trang trong câu hỏi.

Xác thực phía khách hàng sẽ không cho phép bạn gửi biểu mẫu cho đến khi tất cả các trường đáp ứng yêu cầu xác thực, như Kaspars Ozols chỉ ra rằng bạn vẫn sẽ cần phải gọi Model.IsValid trên bộ điều khiển của bạn.

+1

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn. Scott Lance. Tuy nhiên, nó khá không giải quyết vấn đề của tôi kể từ khi lỗi xảy ra trong chuyển đổi loại tôi nghĩ. – embarus

+0

Chế độ xem của bạn có được nhập mạnh mẽ không? Nếu chế độ xem được nhập mạnh, khi đó xác thực thực thi giá trị của loại int được nhập, nếu không bạn sẽ nhận được thông báo lỗi. –

+0

Vâng, đó là kiểu xem mạnh mẽ. Tôi chỉ muốn ghi đè thông báo lỗi khi chất kết dính không thể chuyển giá trị thành int. Ví dụ: Tôi điền vào giá trị 'thử nghiệm' cho hộp văn bản Độ tuổi. Sau khi đăng biểu mẫu, sẽ có thông báo lỗi "Chỉ nhập số." not The 'test' giá trị không hợp lệ cho Age. – embarus

24

Sau khi dành một vài giờ nhìn xung quanh, tôi thấy không có ai thực sự có câu trả lời phù hợp với điều này. Tôi đã tìm thấy một giải pháp phù hợp với tôi vì vậy tôi nghĩ tôi sẽ đăng nó.

Sự cố đối với tôi đã xác thực một giá trị vô hiệu. Khi người dùng nhập giá trị không hợp lệ, thông báo mặc định "Giá trị 'dsfd' không hợp lệ cho vấn đề '.

Giải pháp mà tôi đưa ra là xóa lỗi khỏi trạng thái mô hình và thêm lỗi của riêng tôi .

các lớp để thực hiện xác nhận là dưới đây:

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Parameter | AttributeTargets.Property, AllowMultiple = false)] 
public class ValidInteger : ValidationAttribute 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (value == null || value.ToString().Length == 0) 
     { 
      return ValidationResult.Success; 
     } 
     int i; 

     return !int.TryParse(value.ToString(), out i) ? new ValidationResult(ErrorMessage) : ValidationResult.Success; 
    } 

} 

public class ValidIntegerValidator : DataAnnotationsModelValidator<ValidInteger> 
{ 
    public ValidIntegerValidator(ModelMetadata metadata, ControllerContext context, ValidInteger attribute) 
     : base(metadata, context, attribute) 
    { 
     if(!attribute.IsValid(context.HttpContext.Request.Form[attribute.ObjectId])) 
     { 
      var propertyName = metadata.PropertyName; 
      context.Controller.ViewData.ModelState[propertyName].Errors.Clear(); 
      context.Controller.ViewData.ModelState[propertyName].Errors.Add(attribute.ErrorMessage); 
     } 
    } 
} 

Đừng quên bạn cũng sẽ cần phải đăng ký adapter trong Application_Start toàn cầu()

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(ValidInteger), typeof(ValidIntegerValidator)); 

Và trang trí tài sản của bạn với các thuộc tính mới

[ValidInteger(ErrorMessage = "Please enter a valid number for issue")] 
+6

Điều này phải được đánh dấu là câu trả lời – Harindaka

+2

Tôi cần thay đổi [attribute.ObjectId] thành [metadata.PropertyName] để làm việc này, như @ Christna cũng nói. – nmit026

+1

Câu trả lời hữu ích, nhưng nó không hoạt động ra khỏi hộp khi 'Request.Form' của bạn được lấp đầy với một tập hợp các mục. Ví dụ: 'MyObj [0] .MyProp',' MyObj [1] .MyProp', vv vì 'metadata.PropertyName' sẽ là' MyProp'.Vậy làm thế nào tôi có thể tìm thấy chìa khóa đầy đủ? –

7

Câu trả lời từ wechel ngày 27 tháng 2, 12 làm việc cho tôi, ngoại trừ việc tôi cần phải thay thế dòng

if(!attribute.IsValid(context.HttpContext.Request.Form[attribute.ObjectId])) 

với

if (!attribute.IsValid(context.HttpContext.Request.Form[metadata.PropertyName])) 

Tôi đoán rằng thay đổi là cần thiết vì tôi đang sử dụng MVC4 và đoạn mã được cung cấp đã được viết trong phiên bản trước đó của MVC?

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