主/内容页面和Request.Form /控件名称

时间:2012-05-17 05:48:05

标签: c# asp.net master-pages name-attribute

我最近改变了网站的结构以使用母版页。第一个问题是所有的javascript都没有工作,因为所有的id都发生了变化,所以document.getElementById('id')可以找到id,因为现在id是ct100_something_id。我通过使用ClientIDMode =“Static”来解决这个问题,但现在我发现我在回发时遇到了另一个问题,因为我使用Request.Form并且所有名称属性仍然更改为ct100 _....

据我所知,没有ClientNameMode,所以如何阻止asp.net创建“花哨”的名称属性。我无法在服务器控件上显式设置name属性。

只是为了澄清:

有没有办法做到这一点:

<asp:HiddenField runat="server" ID="hdnUsername" Value="" />

...渲染为:

<input type="hidden" name="hdnUsername" id="hdnUsername" value="" />

......而不是:

<input type="hidden" name="ctl00$bodyContent$hdnUsername" id="hdnUsername" value="" />

2 个答案:

答案 0 :(得分:0)

如果您正在访问控件,则不需要使用Request.Form并直接访问控件。例如this.TextBoxName.Text

如果这对您没有帮助,那么我过去所做的就是创建我自己的TextBox控件,该控件在使用ClientIdMode=Static

时更改name属性以匹配id属性

如果您查看我的博客http://timjames.me/modify-asp.net-textbox-name-attribute

这是我的代码,虽然它是vb.net,所以你需要更改为c#

您可以根据自己的需要调整HiddenFields

Public Class CleanNamesTextBox
    Inherits TextBox

    Private Class CleanNamesHtmlTextWriter
        Inherits HtmlTextWriter

        Sub New(writer As TextWriter)
            MyBase.New(writer)
        End Sub

        Public Overrides Sub AddAttribute(key As System.Web.UI.HtmlTextWriterAttribute, value As String)
            value = value.Split("$")(value.Split("$").Length - 1)
            MyBase.AddAttribute(key, value)
        End Sub

    End Class

    Protected Overrides Sub Render(writer As System.Web.UI.HtmlTextWriter)
        Dim noNamesWriter As CleanNamesHtmlTextWriter = New CleanNamesHtmlTextWriter(writer)
        MyBase.Render(noNamesWriter)
    End Sub

    Sub New(id As String, text As String, cssClass As String, clientIDMode As ClientIDMode)
        MyBase.New()
        Me.ID = id
        Me.CssClass = cssClass
        Me.ClientIDMode = clientIDMode
        Me.Text = text
    End Sub

End Class

答案 1 :(得分:-1)

很抱歉,ASP.net属性通过在控件的id中添加唯一键作为前缀来唯一标识客户端上的服务器控件。