DevExpress:如何获取控件客户端的实例并访问其客户端成员?

时间:2011-10-18 13:45:26

标签: asp.net api devexpress client-side

我有来自DexExpress的DateEdit控件,需要使用Javascript从中获取日期值。从概念上讲,我正在寻找这样的东西:

var d = $("dpEndDate").GetDate();

他们的API引用表明.GetDate()是一个成员,但我只需要知道如何获取包含该成员的对象的客户端实例。

3 个答案:

答案 0 :(得分:4)

必须指定ClientInstanceName属性(对于ASP.NET WebForms)和“Name”属性(对于ASP.NET MVC)以启用控件的客户端程序对象:

<dx:ASPxDateEdit ... ClientInstanceName="de">
</dx:ASPxDateEdit>

var date = de.GetDate();

答案 1 :(得分:1)

如果您正在开发基于多个DevExpress控件的用户控件,这些控件需要能够相互交互,并且您将在给定页面上拥有多个用户控件实例,那么最好使用DevExpress'window.aspxGetControlCollection()和DevExpress控件的ClientID,如下所示:

window.aspxGetControlCollection().elements[clientID];

这样做的缺点是你通常需要在后面的代码中构建客户端事件处理程序,在那里你可以轻松访问DevExpress控件ClientIDs。

ASPxGridView.ClientSideEvents.EndCallback = "function(s,e) { window.aspxGetControlCollection().elements['" + SomeOtherDevExpressControl.ClientID + "'].PerformCallback('callbackArg'); }";

或创建一个JS对象来处理客户端操作并覆盖render方法以添加一些脚本来创建具有所需ClientID的此实例。

JS实例:

window.ClientControl = function(SomeOtherDevExpressControlClientId)
{
    this.SomeOtherDevExpressControlClientId = SomeOtherDevExpressControlClientId;
    this.SomeOtherDevExpressControl() = function(){ return window.aspxGetControlCollection().elements[this.SomeOtherDevExpressControlClientId]; }
    this.GridEndCallback = function(s,e) { this.SomeOtherDevExpressControl().PerformCallback('callbackArg'); }
}

渲染覆盖:

proteced override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    writer.WriteLine();
    writer.WriteBeginTag("script");
    writer.WriteAttribute("type", "text/javascript");
    writer.Write(">");
    writer.WriteLine("window['" + UserControl.ClientInstanceName+ "'] = new ClientControl('" + SomeOtherDevExpressControl.ClientID + "');");
    writer.WriteEndTag("script");

}

使用第二种方法时,假设您向用户控件添加了一个公共字符串属性ClientInstanceName,并在标记中给出了一个值。

答案 2 :(得分:0)

尝试:

var d = $("#<%=dpEndDate %>").GetDate();

原因是ASP.NET ClientID由控件树中的命名容器限定,因此最终可能会像“ctl1_ct12_ct12_dpEndDate”一样。

您可以让ASP.NET 4.0不使用此分层命名,但默认情况下它处于启用状态。