2009-05-22 28 views
5

Tôi có một trang với một số điều khiển, usercontrols, vvthêm runat = "server" thay đổi hành vi của các bố trí

khi tôi thay đổi một div từ đồng bằng <div id="foo"> đến một <div id="foo" runat="server"> bố trí thay đổi hoàn toàn.

tại sao điều đó và cách tôi có thể ngăn chặn nó?

Tôi đang sử dụng 2.0 Khuôn khổ .NET

Có phải vì .NET thay đổi id của tôi, hiển nhiên là tôi không muốn?

+0

Hãy cho chúng tôi mẫu mã để chúng tôi có thể hiểu rõ hơn về tình huống của bạn. –

+0

Bạn có bất kỳ mã phía máy chủ nào áp dụng cho tất cả các điều khiển (điều khiển bằng runat = "máy chủ"), như thêm thuộc tính hoặc kiểu tùy chỉnh không? –

+1

Hoặc tốt hơn, các div của bạn có ID để tạo kiểu CSS không? Thêm runat = "server" có khả năng sẽ thay đổi ClientID cho điều khiển đó khi nó được hiển thị, phá vỡ CSS của bạn. –

Trả lời

12

Nếu bạn đang nhắm mục tiêu ID của điều khiển div trong CSS và sau đó chạy điều khiển tại máy chủ, bạn sẽ thấy nó không còn áp dụng kiểu.

Điều này là do ASP.NET có một cơ chế tích hợp (INamingContainer) để đảm bảo hơn là bạn không có nhiều điều khiển được đặt tên giống nhau. Nó làm điều này bằng cách thêm tiền tố chứa để bạn kết thúc với:

<div id="ctl00_ctl00_myDivName" runat="server" /> 

Cách đơn giản nhất xung quanh này là để thay đổi nó từ làm việc trên một ID để làm việc trên một lớp:

<div class="myDiv" runat="server"></div> 

Ngoài ra, tôi tin rằng XHTML đòi hỏi Divs có thẻ đóng cửa nên sử dụng

<div runat="server">Some content</div> 
0

Khi bạn thêm runat = "server" vào div, hệ thống sẽ tự động tạo ID cho nó. Nó được gọi là ID mangling. Thật không may là không có nhiều mà bạn có thể làm trong khuôn khổ 2.0 cho divs mà tôi nhận thức được (mà không có nó là một nỗi đau anyway), nhưng trong 4.0 chúng tôi đang nhận được một ghi đè ... Trên điều khiển tùy chỉnh mặc dù (trong 2.0) bạn có thể ghi đè lên các trường ClientID và UniqueID. Vì vậy, nếu bạn đã tạo một lớp MyDiv sử dụng div làm cơ sở và sau đó tạo ra các trường ClientID/UniqueID, bạn nên ổn.

Tùy chọn khác của bạn sẽ là cập nhật CSS/javascript của bạn để sử dụng ID bị cắt xén. Nó khá tĩnh dựa trên vị trí trong trang như ASP.Net sử dụng nó để tìm một điều khiển trong khi postback.

+0

Tôi ngạc nhiên khi bạn đề nghị sử dụng một ID bị xáo trộn trong kiểu dáng, điều đó có nghĩa là nếu bạn đã từng thay đổi hệ thống phân cấp điều khiển, CSS sẽ không áp dụng nữa. Thực hành không tốt trong cuốn sách của tôi. Trao đổi nó để sử dụng một lớp học là một lựa chọn duy trì nhiều hơn nữa. –

+1

Tôi sẽ không sử dụng ID bị cắt xén trong CSS. –

+2

Tôi chưa bao giờ nói đó là một lựa chọn tốt. Chỉ là một lựa chọn. – JaCraig

0

Thêm ClientMode = "tĩnh" này sẽ đảm bảo id của bạn không phải là đã thay đổi thành id khách hàng để kiểm soát của bạn.

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