2009-08-05 18 views
5

Tôi có khoảng 600 tài liệu tham khảo mã tương tự như sau ...Làm thế nào để sử dụng JQuery, chọn phần tử bằng ID và ASP.NET mà không đặt ctl00_ ở khắp mọi nơi trong các mã

$("#ctl00_ContentMainPane_eliteUser").html 

Và thay đổi mẫu tổng thể , chỉ để tìm tất cả các mã đã bị hỏng, do hệ thống phân cấp điều khiển thay đổi.

Tất cả javascript được bao gồm trong các tập tin riêng biệt, vì vậy tôi không thể sử dụng mã như thế này ...

$("#<%= eliteUser.clientID%>").html 

Tôi muốn có một giải pháp tốt để sửa chữa vấn đề này để sau khi sửa chữa nó một lần, tôi don không phải sửa đổi tất cả mã nếu mẫu thay đổi trong tương lai.

+1

Các vấn đề khác đã được xác định tại đây: http://stackoverflow.com/questions/1232641 – digiguru

Trả lời

8

Làm thế nào về việc xác định một hàm JavaScript trong trang chủ của bạn như:

function getContainerId() { 
    return "<%=ContentMainPane.ClientID %>"; 
} 

Sau đó trong các tập tin JavaScript bao gồm bạn làm điều gì đó như thế này:

$("#" + getContainerId() + "_eliteUser"); 
1

Theo như tôi biết, asp.net không gây rối với tên lớp học. Thêm tên lớp vào kiểm soát của bạn và sử dụng tên đó làm tham chiếu trong mã của bạn.

2

Bạn có thể làm một cái gì đó như thế này:

$("input[id*=eliteUser]").html() 

Nhưng nếu bạn có nhiều điều khiển kết thúc ID của họ trong eliteUser - nó sẽ không hoạt động.

3

Một cách là sử dụng đối tượng biến js được viết ra ở đầu mỗi trang. Các js bên ngoài của bạn có thể tham chiếu đối tượng cài đặt với thuộc tính mong muốn. Bằng cách này bạn có thể thay đổi id trong các trang aspx của bạn mà không cần mã hóa bất cứ điều gì trong các tập tin js bên ngoài.

Sau đó, bạn có thể hiển thị phương pháp trang materpage hoặc trang cơ sở cho phép mỗi trang thêm các mục id điều khiển vào danh sách. Phương thức cơ sở sau đó có trách nhiệm viết ra tập lệnh pageVars ở đầu mỗi trang.

Rick Strahl cuộc đàm phán về vấn đề này here

tôi thích phương pháp này như bạn vẫn nhận được những lợi ích của selectors nhanh.

Ví dụ:

Nếu bạn nhận được aspx để viết kịch bản sau đây.

var pageVars = { 
    idList: { 
     eliteUser : 'ctl00_ContentMainPane_eliteUser', 
     normalUser : 'ctl00_ContentMainPane_normalUser', 
     powerUser : 'ctl00_ContentMainPane_powerUser', 
     ..... 
    } 
}; 

Sau đó, trong js bên ngoài của bạn

$('#' + pageVars.idList.eliteUser) 
$('#' + pageVars.idList.powerUser)....etc 
0

Đây là một vấn đề mà tôi hiểu được giải quyết trong phiên bản tiếp theo của Visual Studio, tuy nhiên tôi nhận ra điều này sẽ không giúp bạn.

Cách chúng tôi giải quyết nó trên dự án của chúng tôi là một cái gì đó dòng này:

$.extend({ 
    clientID: function(id) { 
     return $("[id$='_" + id + "']"); 
    } 
}); 

Và mã mà sử dụng nó:

statusBar = $.clientID("MSS_MESS_LINE_Static") 
+0

Nhưng nó kết thúc với bộ chọn chậm của con chó vì nó sẽ thu phóng xung quanh phần tử MỌI trên trang có id và sau đó lọc. – redsquare

+0

Bạn có liên kết đến cách "studio trực quan" sẽ giải quyết vấn đề này không? hoặc bạn có nghĩa là khuôn khổ .NET? – digiguru

+0

nửa chừng bài viết này http://www.mostlylucid.net/archive/2008/11/03/way-too-much-information-on-control-ids-and-asp.net-4.0.aspx – redsquare

2

Tôi đã sử dụng một lớp mà kéo dài WebControl để chủ yếu làm giống như RedSquare's suggestion. Tôi đọc suggestion on this blog

/// <summary> 
/// Custom Web control that renders two JavaScript functions out into the page 
/// so that defined control IDs can be used to get a reference to HTML DOM elements 
/// </summary> 
[DefaultProperty("Text")] 
[ToolboxData("<{0}:ClientIdHandler runat=\"server\"></{0}:ClientIdHandler>")] 
public class ClientIdHandler : WebControl 
{ 
    private StringBuilder _builder = new StringBuilder(); 

public ClientIdHandler(){} 


/// <summary> 
/// Renders the ClientID of the control in JavaScript function "clientId" to the specified writer. 
/// </summary> 
/// <param name="output">A <see cref="Control"/> whose ClientID will be included 
/// in the rendered HTML output.</param> 
public void AddControl(Control c) 
{ 
    _builder.AppendFormat(" case '{0}': return '{1}'; break;" + Environment.NewLine, c.ID, c.ClientID); 
} 

/// <summary> 
/// Overrides the Render method to prevent a Start and End <see cref="HtmlTextWriterTag"/> 
/// being rendered in the HTML for the control. 
/// </summary> 
/// <param name="output">A <see cref="HtmlTextWriter"/> that represents 
/// the output stream to render HTML content on the client.</param> 
protected override void Render(HtmlTextWriter writer) 
{  
    RenderContents(writer); 
} 


/// <summary> 
/// Renders the contents of the control to the specified writer. 
/// </summary> 
/// <param name="output">A <see cref="HtmlTextWriter"/> that represents 
/// the output stream to render HTML content on the client.</param> 
protected override void RenderContents(HtmlTextWriter output) 
{ 
    output.Write("<script type=\"text/javascript\"> " + Environment.NewLine); 
    output.Write("function clientId(id) {" + Environment.NewLine); 
    output.Write("switch (id) {" + Environment.NewLine); 
    output.Write(_builder.ToString()); 
    output.Write("  }" + Environment.NewLine); 
    output.Write("}" + Environment.NewLine); 
    output.Write("function getElementByClientId(id) {" + Environment.NewLine); 
    output.Write(" return document.getElementById(clientId(id));" + Environment.NewLine); 
    output.Write("}" + Environment.NewLine); 
    output.Write("</script>" + Environment.NewLine); 
} 
} 

Sau đó, bạn có thể sử dụng trong trang aspx hoặc mã-đằng sau

protected override void OnInit(EventArgs e) 
    { 
     ClientIdHandler clientIds = new ClientIdHandler(); 
     clientIds.AddControl(myControl); 

     this.Controls.Add(clientIds); 

     base.OnInit(e); 
    } 

Mà sẽ render ra sau trong trang

<script type="text/javascript"> 
function clientId(id) { 
switch (id) { 
    case 'myControl': return 'ctl00_Main_myControl'; break; 
    } 
} 
function getElementByClientId(id) { 
    return document.getElementById(clientId(id)); 
} 
</script> 

Vì vậy, trong JavaScript bên ngoài của bạn , bạn có thể sử dụng sau đây

// for jQuery selectors 
var myControl = $('#' + clientId('myControl')); 

// for vanilla JavaScript 
var myControl = getElementByClientId('myControl')); 
1

Tôi đang sử dụng ScriptManager.RegisterStartupScript để nhận tất cả các ClientID mà tôi cần.

  1. Xác định biến javascript trong 'đầu' của trang để lưu trữ ID.
  2. Sử dụng RegisterStartupScript trong Page_Load để gán giá trị cho các biến như sau:

chuỗi MyScript = String.Format ("window.onload = function() {id1 = {0}, id2 = {1}, id3 = {2}} ", Control1.ClientID, Control2.ClientID, Control3.ClientID);

ScriptManager.RegisterStartupScript (Trang, Page.GetType(), "SomeKey", myScript, true);

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