我有一个asp:ListView
,它的ClientIDMode设置为可预测。它的ItemTemplate包含一个asp:textbox
。
textbox的ID和我期望的一样,但它的name
仍然使用看起来像AutoID样式的算法:
<input name="lvFields$ctrl0$tbVal" id="lvFields_tbVal_somekey" type="text"/>
有没有办法让输入的名称像ID一样工作?
(编辑以回答以下问题:)
输入元素的Name
是POST数据中的内容,因此,如果回发更改了ListView绑定到的列表(例如,交换两个元素),则来自文本框的值最终将与错误的键相关联,因为框架基于Name
而不是ID
来关联它们。
发布于 2012-07-11 22:28:57
你可以使用下面帖子中的方法来更改输入的名称,但稍微修改一下:
how to remove 'name' attribute from server controls?
我在Page
控件上重写了RenderChildren
方法,因为我只想完全控制几个控件的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控件,它工作得很好。
发布于 2012-01-17 04:42:59
我非常确定您不能更改名称,尤其是当您修改ClientIDMode时。作为替代方法,您可以添加Title属性。VS将在服务器端代码中将其标记为未知,但它会在HTML中正确呈现。如果你正在做一些客户端操作,你可以这样处理输入:
<script type="text/javascript">
$(document).ready(function () {
$('input:text[title="TextBoxName"]').datepicker();
});
</script>
发布于 2011-06-11 21:22:12
据我所知,没有办法更改input元素的名称。该名称对应于UniqueID属性,该属性由系统生成,您无法控制该属性。似乎你必须找到一种只使用控件ID来实现你想要的东西的方法。
https://stackoverflow.com/questions/4973947
复制相似问题