asp.net 4.0:INPUTs的名称是否有ClientIDMode的等价物?

时间:2011-02-11 20:54:46

标签: asp.net webforms

我有一个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来关联它们。

7 个答案:

答案 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;