2009-09-26 27 views
7

Tôi có ValidationAttribute như:ASP.NET MVC: ValidationAttribute và cục bộ ErrorMessage

public class Username : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
    if (value == null) 
    return false; 

    return RegExp.Validate(RegExpLib.Username,value.ToString()); 
    } 
} 

..và sử dụng nó như thế này:

public class AccountSignIn 
{ 
    [Username(ErrorMessageResourceName ="txtUsername",ErrorMessageResourceType=typeof(SignIn))] 
    public string Username { get; set; } 

    public string Password { get; set; } 

    public bool RememberMe { get; set; } 

    public string ReturnUrl { get; set; } 
} 

signin là tập tin tài nguyên tại App_GlobalResources và "txtUsername" - là tên chuỗi trong tệp tài nguyên.

Sự cố: Thông báo lỗi không được hiển thị.

Câu hỏi: Cách đặt thông báo lỗi nếu tôi có ít ngôn ngữ trên trang web.

Một thông tin:

Tôi có thể truy cập SignIn.txtUsername khỏi Chế độ xem hoặc bất kỳ tập tin trong dự án. Từ điều khiển

ModelState.AddModelError("Username", Resources.SignIn.txtUsername); 

hoạt động tốt cũng .. Tôi có thể gán ErrorMessage bên ValidationAttribute, nhưng đã nhận lỗi sau khi xác nhận thứ hai thử ... nếu tôi đặt kiểm tra như thế này -

if(ErrorMessage != Resources.SignIn.txtUsername) 
     ErrorMessage = Resources.SignIn.txtUsername; 

Tôi có lỗi sau Tôi chuyển sang ngôn ngữ khác - ErrorMessage chỉ có thể được gán một lần.

Vui lòng tư vấn cách tôi có thể giải quyết.

Cảm ơn bạn trước.

Trả lời

1

Đảm bảo trong trình chỉnh sửa tài nguyên mà chế độ hiển thị tài nguyên của bạn được đặt thành "Công khai" chứ không phải là "Nội bộ". Nếu không, phản ánh được thực hiện bởi DataAnnotations sẽ không hoạt động.

+0

Như tôi đã viết Tôi đang sử dụng tài nguyên toàn cầu "Đăng nhập là tệp tài nguyên tại App_GlobalResources" –

+0

Thật không may, bạn không thể tạo tài nguyên trong tài nguyên App_GlobalResources. Bạn phải sử dụng tệp tài nguyên từ thư mục "Properties" thay vì - nhấp chuột phải vào dự án, chọn thuộc tính, từ menu bên trái chọn "Tài nguyên" và nhấp vào "dự án này ...". Tệp tài nguyên mặc định có tên "Resources.resx" sẽ được tạo. Bạn có thể đổi tên nó (ví dụ "ModelErrors") và sử dụng trong mã: [Bắt buộc (ErrorMessageResourceName = "Password_Required", ErrorMessageResourceType = typeof (Properties.ModelErrors))] – Feryt

+0

Đúng, đó là sự thật. DataAnnotations tồn tại được sử dụng bên ngoài ASP.NET, vì vậy họ không biết gì về App_XxxResources và chỉ làm việc với các tệp tài nguyên truyền thống. –

10

Tôi gặp một số sự cố khi sử dụng thông báo lỗi được địa phương hóa và DataAnnotations, khá giống với tình huống của bạn. Mặc dù tôi đã không kết thúc với trống được hiển thị như là thông báo lỗi, tôi luôn luôn có một số ngoại lệ ném. Giải pháp đối với tôi là:

  1. trong App_GlobalResources/Errors.resx mở file tài nguyên, thay đổi nó tính để xây dựng hành động là: Embedded Resource, công cụ Custom: PublicResXFileCodeGenerator, Namespace công cụ Custom: Tài nguyên (visual studio làm điều gì đó kỳ lạ trong autogenerating này, nên kiểm tra lại một lần nữa rằng mọi thứ là ok)

  2. Thay đổi modifier truy cập các tập tin tài nguyên để Công

  3. kiểm tra từ tập tin mã được tạo (Errors.Designer.cs) mà không gian tên và sửa đổi lần truy cập là chính xác.

  4. Thử

dụ của tôi từ lớp mẫu:

[Required(ErrorMessageResourceType = typeof(Resources.Errors), ErrorMessageResourceName="ResponseMessageRequired")] 
public string message { get; set; } 
0

Câu hỏi này có vẻ khá cũ. Tôi đã có một vấn đề tương tự khi sử dụng resx (cửa hàng thông báo lỗi của tôi) làm kiểu tham số thuộc tính trong dự án MVC3 của tôi.

này giải quyết vấn đề của tôi:

  • Set "Messages.resx" - sở hữu tập tin "Xây dựng hành động" để "Resource Embedded"
  • Thay đổi tham số thuộc tính như sau: [Range(0, 999, ErrorMessageResourceType = typeof(Resources.Messages), ErrorMessageResourceName = "ERR_NUM_NOT_IN_RANGE")]

Hi vọng điêu nay co ich.

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