阻止包装ASP.NET服务器控件的<span>标记</span>

时间:2010-09-30 15:41:03

标签: asp.net servercontrols

我正在编写各种ASP.NET Server控件,我需要删除默认情况下包装我的控件的标记。我知道您可以将代码更改为其他代码(如此问题,How Do I Change the render behavior of my custom control from being a span),但您如何预防呢?

我从WebControl继承(也可以从CompositeControl继承)。

我通常得到:

<span>Control output</span>

我需要:

Control output

我重写了RenderContents(HtmlTextWriter输出)和CreateChildControls()方法(跨越各种控件)。我迫切需要使用RenderContents(HtmlTextWriter输出)方法来解决这个问题。

4 个答案:

答案 0 :(得分:39)

这个怎么样?

    public override void RenderBeginTag(HtmlTextWriter writer)
    {
        writer.Write("");
    }

    public override void RenderEndTag(HtmlTextWriter writer)
    {
        writer.Write("");
    }

答案 1 :(得分:3)

更优雅的方法是使用WebControl的控件(默认情况下使用HtmlTextWriterTag.Span调用)

public MyWebControl() : base(HtmlTextWriterTag.Div){}

并覆盖RenderBeginTag方法以添加自定义属性或其他内容:

public override void RenderBeginTag(HtmlTextWriter writer)
    {
        writer.AddAttribute("class", "SomeClassName");
        base.RenderBeginTag(writer);
    }

答案 2 :(得分:2)

我遇到了同样的问题。就我而言,我压倒了这些方法:

protected override void OnPreRender(EventArgs e)
    { /* Insert the control's stylesheet on the page */ }

protected override void RenderContents(HtmlTextWriter output)
        { /* Control rendering here, <span> tag will show up */ }

为防止出现这种情况,我只需将RenderContents覆盖替换为以下内容:

protected override void Render(HtmlTextWriter output)
        { /* Control rendering, no <span> tag */ }

希望这有帮助。

答案 3 :(得分:1)

我认为接受的答案是完全必要的。我可能错了,但渲染方法调用所有三个:

  • RenderBeginTag
  • RenderContents
  • RenderEndTag

所以你应该能够覆盖渲染并手动调用RenderContents:

typedef std::basic_string<TCHAR> tstring;

struct Data
{
    std::vector<tstring> name;
    unsigned int vehicle;
    unsigned int dim;
    int maxQ;
};

int main()
{
    Data Dataset;
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind;
    DWORD dwErr;

    #ifdef UNICODE
    std::wostream &std_out = std::wcout;
    std::wostream &std_err = std::wcerr;
    #else
    std::ostream &std_out = std::cout;
    std::ostream &std_err = std::cerr;

    // Find the first file in the directory.
    hFind = FindFirstFile(TEXT("C:\\Users\\bla\\Desktop\\c++\\data\\*.txt"), &FindFileData);

    if (hFind == INVALID_HANDLE_VALUE)
    {
        dwErr = GetLastError();
        if (dwErr != ERROR_FILE_NOT_FOUND)
            std_err << TEXT("ERROR: ") << dwErr << std::endl;
    } 
    else
    {
        do
        {
            if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
            {
                Dataset.name.push_back(FindFileData.cFileName);
                //std_out << FindFileData.cFileName << std::endl;
            }
        }
        while (FindNextFile(hFind, &FindFileData));

        dwErr = GetLastError();
        if (dwErr != ERROR_NO_MORE_FILES)
            std_err << TEXT("ERROR: ") << dwErr << std::endl;

        FindClose(hFind);
    }

    for(int i = 0; i < Dataset.name.size(); i++)
    {
        std_out << Dataset.name[i] << std::endl;
    }

    return 0;
}

任何?也许我错过了什么。我知道这个帖子已经老了,但我最近碰到了这个,上面是我的解决方案。