在使用ASP.NET CheckBox
时(在我们的案例中,是从CheckBox
继承而来),它会在复选框输入控件周围呈现一个元素,这个元素会影响jQuery脚本。
在渲染时是否可能移除这个元素?
在使用ASP.NET CheckBox
时(在我们的案例中,是从CheckBox
继承而来),它会在复选框输入控件周围呈现一个元素,这个元素会影响jQuery脚本。
在渲染时是否可能移除这个元素?
发现了这个有用的提示:
在后台代码中,使用InputAttributes而不是Attributes。
例如,输入以下内容:
chk.InputAttributes.Add("onchange", "updateFields()")
使用这个替代:
chk.Attributes.Add("onchange", "updateFields()")
或者使用内联声明的替代方法:
<asp:CheckBox ID="chk" runat="server" onchange="updateFields()" />
最后两个将使包装span。我在测试页面上尝试了这个方法,但是复选框控件周围没有边框...你确定是复选框导致的吗?这是有条件的吗?
更新:好的,看起来这取决于复选框是否具有额外的属性,包括CssClass设置...或者“disabled”属性。
我不确定这个方法是否适用于这个特定的示例。但是,如果您制作自己的WebControl并且永远不希望它在自身周围呈现跨度,您可以像这样覆盖控件渲染方法:
public class MyWebControl : WebControl
{
/* Your code
between here */
protected override void Render(HtmlTextWriter writer)
{
RenderContents (writer);
}
}
public class MyCheckBox : CheckBox
{
/* Your code
between here */
protected override void Render(HtmlTextWriter writer)
{
RenderContents (writer);
}
}
这个解决方案的基本问题在这里得到了更好地解释:
http://www.marten-online.com/net/stripping-span-tag-from-webcontrol.html
我花了最近的三个小时绞尽脑汁寻找这个问题的解决方案。
以下是我的结论:
using System.Web.UI;
using System.Web.UI.WebControls;
/// <summary>
/// Represents a custom checkbox web control.
/// Prevents itself to be wrapped into a <span> tag when disabled.
/// </summary>
public class CustomCheckBox : CheckBox
{
/// <summary>
/// Renders the control to the specified HTML writer.
/// </summary>
/// <param name="writer">The HtmlTextWriter object that receives the control content.</param>
protected override void Render(HtmlTextWriter writer)
{
// Use custom writer
writer = new HtmlTextWriterNoSpan(writer);
// Call base class
base.Render(writer);
}
}
除了自定义控件,您还需要一个自定义的HtmlTextWriter:
using System.IO;
using System.Web.UI;
/// <summary>
/// Represents a custom HtmlTextWriter that displays no span tag.
/// </summary>
public class HtmlTextWriterNoSpan : HtmlTextWriter
{
/// <summary>
/// Constructor.
/// </summary>
/// <param name="textWriter">Text writer.</param>
public HtmlTextWriterNoSpan(TextWriter textWriter)
: base(textWriter)
{ }
/// <summary>
/// Determines whether the specified markup element will be rendered to the requesting page.
/// </summary>
/// <param name="name">Name.</param>
/// <param name="key">Tag key.</param>
/// <returns>True if the markup element should be rendered, false otherwise.</returns>
protected override bool OnTagRender(string name, HtmlTextWriterTag key)
{
// Do not render <span> tags
if (key == HtmlTextWriterTag.Span)
return false;
// Otherwise, call the base class (always true)
return base.OnTagRender(name, key);
}
}
只是提供信息,使用:
checkbox.InputAttributes.Add("disabled", "disabled");
有同样的效果,但是:
<script>
$(".selector input").unwrap().addClass("cssclass");
</script>
protected override HtmlTextWriterTag TagKey
{
get
{
return HtmlTextWriterTag.Div;
}
}
应该做什么
<p>12345<asp:Label ID="lblMiddle" runat="server" Text="6"></asp:Label>7890</p>
<p>12345<asp:Literal ID="ltlMiddle" runat="server" Text="6"></asp:Literal>7890</p>
public MyCustomControl() : base(HtmlTextWriterTag.Div)
{
}
HtmlTextWriterTag
替换为任何可用选项,比如上面的示例中的Div。默认值是Span
。如果您不需要标签,可以直接使用输入/复选框控件,或者自己添加一个:
<input type="checkbox" id="CheckBox1" runat="server" />
<label for="CheckBox1">My Label</label>
SetRenderMethodDelegate()
方法。Rick Strahl在这里详细介绍了它:http://www.west-wind.com/Weblog/posts/6138.aspx - Nick Craver<span />
包裹了 <input />
标签,如果正确处理会非常低效。 - Dan Herbert