2010-12-17 34 views
11

Mục tiêu của tôi là xác thực đầu vào của người dùng ở phía máy khách, tùy thuộc vào văn hóa của người dùng.ASP.NET MVC 3 RC 2 xác thực phía khách hàng với toàn cầu hóa

Tôi có một mô hình dữ liệu nguyên thủy với cấu trúc sau:

public class User 
{ 
public int UserId { get; set; } 

[Required] 
[StringLength(20,MinimumLength=3)] 
public string Name { get; set; } 

[Required] 
public double Height { get; set; } 
} 

Hơn nữa, tôi muốn có xác nhận client-side được kích hoạt, kiểm tra nếu nó là một số hợp lệ. Do đó, tôi đã thêm các dòng sau vào phần <head> của _Layout.cshtml của tôi.

<script src="@Url.Content("~/Scripts/jQuery-1.4.2.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

Vì tôi muốn có khả năng để xác nhận đầu vào trong các định dạng ngôn ngữ khác (trong bối cảnh đặc biệt này đó là Đức với định dạng số thập phân của 0,75 trong khi ở Mỹ nó sẽ là 0.75), tôi đã thêm các dòng sau (jQuery Globalization PlugIn) SAU được đề cập trước đây jquery.validate.min.jsjquery.validate.unobtrusive.min.js.

<script src="@Url.Content("~/Scripts/jquery.glob.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/globinfo/jquery.glob.de-de.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
$(document).ready(function() { 
    $.culture = jQuery.cultures['de-DE']; 
    $.preferCulture($.culture.name); 
}); 
</script> 

Ngoài ra, tôi đã thêm các dòng sau vào web.config trong phần system.web chỉ để chắc chắn rằng nền văn hóa Đức luôn được chọn:

<globalization culture="de-DE" uiCulture="de-DE" /> 

Bây giờ tôi đang trải qua những hành vi sau đây :

  • Nếu tôi nhập 0,1 (lưu ý chính tả của Đức ') trong hộp văn bản cho giá trị "Chiều cao", thông báo lỗi xác thực The field Height must be a number xuất hiện và tôi không thể gửi biểu mẫu.
  • Nếu tôi gõ vào 0.1 (tiếng Anh 'chính tả'), tôi có thể gửi biểu mẫu nhưng validation server-side trả về thông báo lỗi xác nhận sau The value '0.1' is not valid for Height.

Vì vậy, bây giờ tôi đang ở một số loại khóa chết nơi Tôi không thể ra ngoài.

Một lần nữa, mục tiêu của tôi là xác thực số đầu vào thập phân trên phía máy khách và phía máy chủ, dựa trên văn hóa của người dùng (trong trường hợp này buộc phải là tiếng Đức). Tôi đang làm gì sai?

Mọi trợ giúp đều được đánh giá cao! Cảm ơn bạn trước!

Trả lời

8

Thật không may là có xung đột đặt tên giữa các hàm jQuery.validate.format và jQuery.Globalization.format. Do đó, bạn sẽ phải thay đổi mã của mình để sử dụng plugin Globalization không jquery.

Tôi vừa viết một bài đăng blog về nó here.

Đối với bạn nó sẽ giống như thế này:

<script src="@Url.Content("~/Scripts/globalization.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/globinfo/Globalization.de-DE.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
$.validator.methods.number = function (value, element) { 
    if (!isNaN(Globalization.parseFloat(value))) { 
     return true; 
    } 
    return false; 
} 
$(document).ready(function() { 
    $.culture = jQuery.cultures['de-DE']; 
    $.preferCulture($.culture.name); 
    Globalization.preferCulture($.culture.name); 
}); 
</script> 

Đó nên là đủ.

+0

'if' của bạn xác định sai' 0' dưới dạng giá trị không hợp lệ; sử dụng 'return! isNaN (Globalization.parseFloat (value));' là phần thân của hàm. –

+0

Bạn có thông báo cho người tạo plugin không? Bạn vui lòng làm như vậy nếu chưa được thực hiện. Tôi đang gặp vấn đề tương tự như sde nhưng tôi không muốn "hack" với các phương thức không chính thức hoặc ghi đè. – toebens

+0

Vâng, chỉ cần tiết kiệm cho tôi một tấn mã đào - bạn là một ngôi sao, cảm ơn rất nhiều cho bài đăng blog và chia sẻ trên SO! – Dav

1

Tôi phải tắt UnobtrusiveJavaScript. Trang không phản ứng ngay lập tức nữa, nhưng ít nhất nó hoạt động.

Bạn có thể tắt theo mặc định trong Web.Config.

<appSettings> 
    <add key="enableSimpleMembership" value="false"/> 
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="false"/> 
</appSettings> 

Và tôi sử dụng các kịch bản Microsoft để xác thực:

MicrosoftAjax.js 
MicrosoftMvcAjax.js 
MicrosoftMvcValidation.js 

Và cũng là jquery.glob điều jquery-1.4.4.min.js &, nhưng tôi nghĩ rằng tôi sử dụng chúng trong nội bộ. Việc xác thực đang được thực hiện bởi các kịch bản MS.

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