2009-07-28 41 views
33

Tôi đã làm việc với ASP.NET MVC và Javascript/jQuery nhiều lần gần đây và dường như tôi đang đi theo hướng mà tôi luôn cần phải vượt qua một số giá trị động "tới" javascript của tôi. Khi kịch bản là ngay trong trang, tôi đã thực hiện một cái gì đó như thế này:Thực tiễn tốt nhất để chuyển dữ liệu từ asp.net-mvc sang javascript

var isEditable = <%=ViewData["editable"]%> 

Tôi thích cách này là nhanh chóng & dễ dàng và cũng giống như tôi muốn tiêm một giá trị vào HTML. Nhưng mùi này. Thực sự, thực sự xấu. Và nó phá vỡ định dạng mã và intellisense của Visual Studio, làm cho các kịch bản của tôi khó đọc và dễ hiểu.

Nó đã xảy ra với tôi một giải pháp khác sẽ được truyền dữ liệu của tôi đến một lĩnh vực ẩn, và có tham khảo Javascript mà ...

<input type="hidden" id="editable" value="<%=ViewData["editable"]%>" /> 
var isEditable = $("#editable").attr("value"); 

Đây có lẽ là tốt hơn nhiều vì nó giữ cho kịch bản còn nguyên vẹn và sẽ cho phép tôi chuyển nó sang tệp .js bên ngoài. Nhưng một cái gì đó về giải pháp này không có vẻ lý tưởng. hay la chỉ Minh tôi?

Có ai có thể đề xuất giải pháp & các phương pháp hay nhất để chuyển dữ liệu vào tập lệnh của bạn không? Tôi đã đi xuống con đường sai lầm nếu kịch bản của tôi kết thúc rất nhiều dựa vào viewdata từ bộ điều khiển của tôi ở nơi đầu tiên?

+1

Làm thế nào về "kéo" dữ liệu từ mô hình vào một số loại lưu trữ dữ liệu trong bộ điều khiển với AJAX? – Janie

+1

Tôi nghĩ AJAX sẽ quá mức cần thiết trong trường hợp tôi đang đề cập đến ... Kịch bản của tôi thường chỉ cần biết một vài bit dữ liệu từ bộ điều khiển/mô hình (dữ liệu đã có trên trang thực thi ban đầu) để phát hành một cuộc gọi mạng trở lại một bộ điều khiển có vẻ như một chút nhiều. –

Trả lời

11

đôi khi tôi truyền dữ liệu cho trang web của tôi bằng cách viết một đối tượng cấu hình trang thông qua một serializer JSON:

var pageConfig = <%= ServerConfig.ToJson() %>; 

Trong trường hợp bạn cần phải viết phương pháp ToJson mình. Điều này giữ trạng thái trang độc đáo, để chỉ có một nơi mà bạn bơm các giá trị máy chủ. Mọi thứ từ đây trở đi là javascript thuần túy. Trong ví dụ của bạn, bạn có thể thực hiện:

var isEditable = pageConfig.isEditable; 

ngay cả trong tệp js bên ngoài, nếu pageConfig là toàn cầu. Trong trường hợp đó, mặc dù, bạn nên đúng không gian tên nó: MY_APP.pageConfig có lẽ.

+0

Điều này không ảnh hưởng đến khả năng truy cập?Ít nhất mỗi trang GET có thể trả về một trang khác (cấu hình khác). Khi suy nghĩ về lưu trữ trong máy chủ proxy, bây giờ bạn sẽ có một phiên bản khác của trang đó cho từng người dùng. Đó có phải là một mối quan tâm? –

+0

Đây là một tùy chọn hấp dẫn, nhưng tôi không chắc tôi hiểu chính xác cách bạn đang triển khai lớp ServerConfig này. Thật vậy mỗi trang GET có thể trả về một tập hợp dữ liệu khác nhau, vì vậy cuối cùng trang sẽ không được thiết lập từ Chế độ xem của mỗi trang? Bất kể, các đề xuất khác của bạn là một cái gì đó tôi chắc chắn sẽ thử/xem xét (Json và một biến js toàn cầu) - cảm ơn! –

+0

@Kurt - vâng, tôi nghĩ bạn sẽ phải xây dựng nó từ ViewData (có thể là một kiểu ẩn danh). Tôi không có nghĩa là bạn có thể loại bỏ ViewData, nhưng bạn có thể giới hạn số lượng nơi bạn đang tiêm dữ liệu máy chủ trên trang. –

0

Bạn sẽ tiêm thông tin đó theo cách này hay cách khác. Và IMO, ví dụ đầu tiên của bạn không thực sự khác với ví dụ thứ hai.

Một giải pháp khác là có một lớp JS (hoặc mẫu thử nghiệm?) Sẽ chấp nhận một đối tượng tùy chọn. Mặc dù thừa nhận, nó không thực sự khác với những ví dụ bạn đã đưa ra. Nhưng vẫn còn, có lẽ bạn muốn đi theo cách này.

$(function() { 
    myClass.init({ isEditable: <%=ViewData["editable"]%>, 
     another: '<%=ViewData["another"]%>' }); 
}); 
0

Tôi nghĩ @ çağdaş là một điểm tốt, nhưng hãy nhớ kiểm tra phía máy chủ. Nếu bạn đặt trường thành "chỉ đọc" thì không có gì để ngăn người dùng sửa đổi cờ đó, thay đổi trường chỉ đọc và gửi.

0

Toàn bộ doanh nghiệp của Ajax là để tải thông tin không đồng bộ. Nếu bạn đang làm công việc của Ajax (tải thông tin và giữ nó trong một biến), đó là lấy sức mạnh từ nó. Tại sao bạn không thử JQuery và sử dụng Ajax, hoặc nhận các hàm để tải nội dung động. Nó sẽ giúp trang của bạn tải nhanh hơn.

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