我有一个asp:ListView
,其ClientIDMode设置为Predictable。其ItemTemplate包含asp:textbox
。
文本框的ID正如我所期望的那样,但其name
仍在使用看起来像AutoID风格的算法:
<input name="lvFields$ctrl0$tbVal" id="lvFields_tbVal_somekey" type="text"/>
有没有办法让我的输入名称像ID一样?
(编辑以回答以下问题:)
输入元素的Name
是POST数据中的内容,因此如果回发改变了ListView绑定的列表(例如,交换两个元素),则文本框中的值最终会与错误的密钥,因为框架是基于Name
而不是ID
来关联它们。
答案 0 :(得分:2)
您可以使用以下帖子中的方法更改输入的名称,但稍微修改一下:
how to remove 'name' attribute from server controls?
我在RenderChildren
控件上过度使用Page
方法,因为我只想完全控制一些控件的HTML:
protected override void RenderChildren(HtmlTextWriter writer)
{
var unScrewNamesRender = new RenderBasicNameHtmlTextWriter(writer);
base.RenderChildren(unScrewNamesRender);
}
private class RenderBasicNameHtmlTextWriter : HtmlTextWriter
{
public RenderBasicNameHtmlTextWriter(TextWriter writer) : base(writer) { }
public override void AddAttribute(HtmlTextWriterAttribute key, string value)
{
if (key == HtmlTextWriterAttribute.Name && value.Contains("POLine"))
{
value = value.Substring(value.LastIndexOf("$") + 1);
}
base.AddAttribute(key, value);
}
}
如果您尝试这样做,您确实需要知道自己在做什么,WebForms会认为控件丢失了,因此您无法在任何回发中使用它。出于我的目的,我想在服务器或客户端添加任意数量的多行,而不必处理.Net Ajax控件,它可以正常工作。
答案 1 :(得分:1)
我很确定您无法更改名称,尤其是在修改ClientIDMode时。或者,您可以添加Title属性。 VS会在服务器端代码中将此标记为未知,但它会在HTML中正确呈现。如果你正在做一些客户端操作,你可以这样解决输入:
<script type="text/javascript">
$(document).ready(function () {
$('input:text[title="TextBoxName"]').datepicker();
});
</script>
答案 2 :(得分:0)
据我所知,无法更改输入元素的名称。该名称对应于UniqueID属性,该属性由系统生成,您无法控制。似乎你必须找到一种方法,只使用控件ID来实现你想要的东西。
答案 3 :(得分:0)
两个名字都使用可预测的模式;最初,名字也等于ct100_ct100等。从我看到的,这是一个可预测的名称。客户端ID值将始终在控制前缀之间使用_,唯一ID(名称属性)将始终使用$。这两个将始终匹配,除了一些利用名称的控件(radiobuttonlist用于分组)。
HTH。
答案 4 :(得分:0)
我有一次完全相同的问题,并且必须使用“System.Web.UI.Control”中公开的其中一个属性来获取服务器端的客户端控件名称。
使用这些属性并自己在服务器端构建“名称”并使用Request.Form(“NameHere”)
Me.ClientIDSeparator
Me.IdSeparator
Me.UniqueID
答案 5 :(得分:0)
jquery解决方案
function removeNameAttribute() {
$('input, select').each(function () {
$(this).removeAttr("name");
});
}
答案 6 :(得分:0)
//使用HtmlGenericControl
HtmlGenericControl input = new HtmlGenericControl("input");``
input.ID = "lvFields_tbVal_somekey";
input.Attributes.Add("name", "tbVal");
input.Attributes.Add("type", "text");
input.ClientIDMode = ClientIDMode.Static;