Tom*_*len 8 html c# asp.net webforms
当我在ASP.net中生成我的控件时,它们会像这样出现:
<div id="ctl00_mainContent_ApprovalSelectPanel" class="discussWrapper">
<span class="cbox highlighted"><input id="ctl00_mainContent_ctl00" type="checkbox" name="ctl00$mainContent$ctl00" checked="checked" value="70" /><label for="ctl00_mainContent_ctl00">Buyer1</label></span><span class="cbox"><input id="ctl00_mainContent_ctl01" type="checkbox" name="ctl00$mainContent$ctl01" value="75" /><label for="ctl00_mainContent_ctl01">Buyer2</label></span><span class="cbox"><input id="ctl00_mainContent_ctl02" type="checkbox" name="ctl00$mainContent$ctl02" value="280" /><label for="ctl00_mainContent_ctl02">Client3</label></span><span class="cbox"><input id="ctl00_mainContent_ctl03" type="checkbox" name="ctl00$mainContent$ctl03" value="281" /><label for="ctl00_mainContent_ctl03">Client4</label></span><span class="cbox"><input id="ctl00_mainContent_ctl04" type="checkbox" name="ctl00$mainContent$ctl04" value="283" /><label for="ctl00_mainContent_ctl04">Client2</label></span><span class="cbox"><input id="ctl00_mainContent_ctl05" type="checkbox" name="ctl00$mainContent$ctl05" value="289" /><label for="ctl00_mainContent_ctl05">Client1</label></span><span class="cbox"><input id="ctl00_mainContent_ctl06" type="checkbox" name="ctl00$mainContent$ctl06" value="346" /><label for="ctl00_mainContent_ctl06">artworker1</label></span><span class="cbox"><input id="ctl00_mainContent_ctl07" type="checkbox" name="ctl00$mainContent$ctl07" value="362" /><label for="ctl00_mainContent_ctl07">buyer3</label></span><span class="cbox"><input id="ctl00_mainContent_ctl08" type="checkbox" name="ctl00$mainContent$ctl08" value="367" /><label for="ctl00_mainContent_ctl08">meeeee</label></span><span class="cbox"><input id="ctl00_mainContent_ctl09" type="checkbox" name="ctl00$mainContent$ctl09" value="368" /><label for="ctl00_mainContent_ctl09">stake</label></span>
</div>
Run Code Online (Sandbox Code Playgroud)
查看源代码时非常难看且难以理解.这通常不是问题,但我的网站正在为访问者提供资源和教程,其中查看源代码是体验的一部分.
有没有办法很好地渲染这些控件?缩进正确,更好的ID和名称等?
小智 14
在.NET 4.0中,您可以将ClientIDMode设置为4个选项之一AutoID,Static,Predictable和Inherit.您可能正在寻找静态,因为这将确保您的控件呈现给具有您分配给它们的ID的页面.
您可以通过添加:在应用程序级别设置它:
<pages clientIDMode="Static">
Run Code Online (Sandbox Code Playgroud)
到你的web.config
这里有关于这些变化的更多细节:http://beyondrelational.com/blogs/hima/archive/2010/07/16/all-about-client-id-mode-in-asp-net-4.aspx
ASP.NET WebForms HTML呈现和控制标记在.NET 4.0中得到了改进,这将有助于控制ID和HTML元素本身的结构(如Rob Stone对您的问题的回答中所述).但是,缩进和换行可能仍然不能满足您的需求.
如果HTML源确实是应用程序用户体验的一部分,您可以考虑编写附加到ReleaseRequestState事件的HttpModule.此方法将解决HTML源的实际换行符和缩进.为避免重新发明轮子,您可以使用HTML Tidy的.NET端口或HTML Tidy的.NET Wrapper作为响应的自定义过滤器的一部分.
有一个很好的例子,说明如何在本博客中的HttpModule中编写自定义过滤器.我发现最有用的代码部分如下(稍加编辑,但您可以从博客本身获得完整的理解):
public class CustomModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);
}
private void context_ReleaseRequestState(object sender, EventArgs e)
{
HttpResponse response = HttpContext.Current.Response;
if (string.Compare(response.ContentType,"text/html",true) == 0)
{
response.Filter = new CustomFilter(response.Filter,response.ContentEncoding);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在CustomFilter类中...
public override void Write(byte[] buffer, int offset, int count)
{
sb = new StringBuilder(count + 1024);
sb.Append(enc.GetString(buffer,offset,count));
// <---- Run the sb content through HTML Tidy here ---->
byte[] buff = enc.GetBytes(sb.ToString());
s.Write(buff,0,buff.Length);
}
}
Run Code Online (Sandbox Code Playgroud)