设置runat = server时输入名称和ID更改

Ozk*_*kan 24 .net forms asp.net validation

在我的表单中,我需要插入"text"类型的不同输入.输入必须是带有名称和ID的html控件.因为我将此表单发送到外部URL.

为了验证,我在所有输入中运行runat = server,然后我可以使用requiredfieldvalidator.

但问题是,当我在浏览页面后查看源名称和ID都已更改.例如

<input id="first_name" class="formright" type="text" name="first_name" runat="server" />
Run Code Online (Sandbox Code Playgroud)

改变为

<input name="ctl00$cphContent$first_name" type="text" id="ctl00_cphContent_first_name" class="formright">
Run Code Online (Sandbox Code Playgroud)

我必须使用html控件,因为外部postbackurl查看name和id值以查找控件.所以我不能使用asp控件.因为我使用了runat = server的html控件

我感谢任何帮助

Tow*_*own 27

这是因为您正在使用MasterPages.

内容页面中包含的控件采用基于母版页层次结构的动态ID,以避免重复ID.

如果需要在客户端脚本中引用控件ID和名称,则可以使用<%= first_name.ClientID %>.

如果您使用的是.NET4,则可以使用ClientIDMode="Static"生成的ID保持一致,但这会带来自己的ID冲突警告,例如,在页面上使用同一用户控件的多个实例时.Rick Strahl 在这里概述了这些.

但是,如果您使用的是ASP.NET验证器,那么一切都应该没问题.input您应该使用ASP.NET TextBox控件而不是使用HTML :

<asp:TextBox id="first_name" runat="server" CssClass="formright" />
Run Code Online (Sandbox Code Playgroud)


Rad*_*erz 17

ClientIDMode="Static"
Run Code Online (Sandbox Code Playgroud)

这有用地锁定任何runat ="server"控件的ID,但是它不会锁定html输入元素的'name'属性.

在这个例子中看到输入上有runat ="server"属性的唯一原因是使用.Net验证,我建议使用外部JS库(如jQuery)来处理这个问题.

但是,如果像我一样,你需要改变value属性,我能看到的唯一解决方法是相当混乱.如果从输入中删除runat ="server",则可以在value =""属性中放置服务器控件(如文字).

例如:

<input id="first_name" class="formright" type="text" name="first_name" value="<asp:Literal id="litFirstNameValue" runat="server" />"  />
Run Code Online (Sandbox Code Playgroud)

请不要因为这种糟糕的编码习惯而对我有所帮助,它的目的是使名称属性不会更改为.Net样式名称作为最后的手段.

有没有其他人知道另一种修复名称的方法?(表单元素未定义为runat ="server",但它嵌入在正常的.Net表单中,这就是服务器将其附加到主表单树的原因)


小智 12

ClientIDMode仅影响ID.如果你还需要管理name属性那么它就没用了.在我的情况下,我使用jQuery在客户端解决了这个问题.

$(function(){

    $("#inputname").prop("name",$("#inputname").prop("id"));

});
Run Code Online (Sandbox Code Playgroud)


Sha*_*ard 7

添加ClientIDMode="Static"到控件,例如

<asp:TextBox ID="first_name" runat="server" ClientIDMode="Static" />
Run Code Online (Sandbox Code Playgroud)

这是.NET 4中的新功能.官方文档.