母版/内容页和请求表单/控件名称

本文关键字:表单 控件 请求 母版 | 更新日期: 2023-09-27 18:34:30

我最近更改了网站的结构以使用母版页。第一个问题是所有的javascript都不起作用,因为所有的id都改变了,所以document.getElementById('id'(可以找到id,因为现在id被ct100_something_id了。我通过使用 ClientIDMode="静态" 解决了这个问题,但现在我发现我在回发时遇到了另一个问题,因为我使用 Request.Form 并且所有名称属性仍然更改为 ct100_....

据我所知,没有客户端名称模式,那么我如何阻止 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="" />

母版/内容页和请求表单/控件名称

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

如果这对您没有帮助,那么我过去所做的是创建自己的TextBox控件,该控件在使用时更改 name 属性以匹配 id 属性ClientIdMode=Static

如果你看看我的博客 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

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