2009-12-21 23 views
1

我有一个WebForms应用程序,它主要运行在Postback上。但是现在,我想越来越多地使用jQuery,并且我宁愿控制ClientID,以便我有一个真正的“#id”选择器,而不是使用“input [id $ = myID]”。ASP.net Webforms,控制ClientID的方法

现在,因为我仍然喜欢使用ASP.net Controls(我需要通过CodeBehind与他们合作),我不知道是否有很好的替代方案?

有问题的应用程序在SharePoint 2007和2010上运行,这意味着a)无法切换到ASP.net MVC和b).ASPX文件内没有内联代码,这也意味着无法动态构建使用$("<%= MyControl.ClientID %>)的JavaScript。 (是的,我知道我可以在web.config中启用内联代码,但我想避免这种情况)

现在的一种方法是使用ASP:Literals并在CodeBehind中完全构建HTML,但似乎相当笨拙。任何其他方法,或者我运气不好?

回答

3

您可以覆盖客户端ID产生,因此ASP.NET不裂伤控制名字。我在this thread上发布了一个例子。

基本思路是覆盖后代类中的ClientID和UniqueID属性,然后使用该类而不是内置的ASP.NET控件。提供的示例演示了一个文本框,但这适用于任何服务器控件。

这种方法的好处是它不需要将ID传递给标记。但是,要确保您不会生成具有相同ID的多个组件(例如,在中继器或列表视图中)。

另外:从来没有永远不会在代码隐藏生成你的标记。使用列表视图,中继器或其他控件。在后台代码中生成标记会导致维护噩梦,尤其是当设计师(熟悉图形,HTML和CSS,但不一定是C#)需要对工作进行更改时尤其如此。帮你一个忙,并在它所属的ASPX中保留标记,并在.cs中编码。从参考线

更新部分代码示例:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 


namespace MyControls 
{ 
    public class Textbox : System.Web.UI.WebControls.TextBox 
    { 
     public override string ClientID 
     { 
      get 
      { 
       return ID; 
      } 

     } 

     public override string UniqueID 
     { 
      get 
      { 
       return ID; 
      } 
     } 

    } 

    public class Button : System.Web.UI.WebControls.Button 
    { 

     public override string ClientID 
     { 
      get 
      { 
       return ID; 
      } 

     } 

     public override string UniqueID 
     { 
      get 
      { 
       return ID; 
      } 
     } 
    } 
} 
+0

永远不能说永不。只要你不把风格放在那里,渲染标记并不是太糟糕。 – 2009-12-21 21:03:59

4

这是一个非常常见的ASP.NET Web窗体的投诉,不幸的是你可以做的事情不多。 .NET 4将给我们更多的控制ClientID的生成,但在此之前,它不可避免地会令人头疼。

一个选择是在后面的代码中构建一个JSON字符串,该字符串包含您需要的一些clientID,并使用ClientScript.RegisterClientScriptBlock将其暴露给客户端。这不是很好,但它比在后面的代码中生成HTML要好。

代码背后:

String jsonClientIDs = "window.ClientIDs = { " + 
         "oneControlClientID: '" + oneControl.ClientID + "'," + 
         "twoControlClientID: '" + twoControl.ClientID + "'" + 
         "}"; 

Page.RegisterClientScriptBlock(GetType(), "ClientIDs", jsonClientIDs, true); 

的Javascript:

function myFunction() 
{ 
    $(ClientIDs.oneControlClientID).hide(); 
    $(ClientIDs.twoControlClientID).show(); 
}