无法将日期选择器绑定到详细信息视图中的编辑项模板

unable to bind datepicker to edititemtemplate in detailsview

我的详细信息视图中有以下模板来编辑日期:

<EditItemTemplate>
                        <asp:TextBox id="EndDate" class="datefield" text='<%# Bind("EndDate")%>' runat="server"/>
                    </EditItemTemplate>

我正在使用带有以下代码的按钮切换到编辑模式:

protected void Edit_Assignment(object sender, EventArgs e) {

            if (_gvAssignments.CurrentMode != DetailsViewMode.Edit) {
                _gvAssignments.ChangeMode(DetailsViewMode.Edit);
            }


        }

我还准备了文档和调用日期选择器的 onclientclick 函数。

$(document).ready(function() {
            $("#tabs").tabs();
            $(".datefield").datepicker();
            $("#StartDate").datepicker();
            $("#EndDate").datepicker();
        });

        function updateDatepickFields() {
            alert("Button clicked");
            $(".datefield").datepicker();
            $("#StartDate").datepicker();
            $("#EndDate").datepicker();
        };
        $(".datefield").on("focus",function() {
            $(".datefield").datepicker();
        });

然而,无论我使用什么代码,它似乎都没有附加日期选择器。

在浏览器中右键单击您的页面,检查元素,然后找到您的 EndDate 元素。您会注意到它的 ID 呈现为完全不同的东西!这是因为 ASP.Net 将重命名服务器端控件以避免标识冲突。

考虑到这一点,您可能会开始意识到这个问题 - 在 Jquery 中引用 $('#EndDate') 将不起作用,因为没有具有该 ID 的元素。

最简单的选择是将 ClientIDMode="static" 属性 添加到您的文本框:

<asp:Textbox runat="server" ClientIdMode="static" ID="EndDate">

这会强制元素使用给定的 ID 呈现,而不是 "rewritten"。然后,您可以像往常一样访问这些元素,并尽享快乐。


如果您有类似 <asp:Repeater><asp:GridView> 的内容,请避免使用此方法。因为元素是重复的,所以这会导致重复的 ID。在这种情况下,使用 ClientIdMode="Predictable",这会将您的项目呈现为更像 EndDate_0EndDate_1 等的东西。