Консультация № 173720
26.10.2009, 23:08
25.00 руб.
0 5 1
Здравствуйте!
Возможно, кто-нибудь сталкивался с подобным. Пытаюсь создать собственный ajax-контрол в VS 2008 по этому руководству. Всё нормально компилируется и билдится, но при попытке запустить страницу (asp сайт) с использованием созданного экстендера, страница не грузится, выдавая ошибку javascript:
"name: Sys.ArgumentNullException
message: Sys.ArgumentNullException: Значение не может быть неопределенным.
Имя параметра: id"
Перепробовала всё, что пришло в голову, но ничего не помогает. Если кто знает, в чём может быть дело, подскажите, пожалуйста. Проект прилагаю. Отдельно код - в приложении.
Спасибо!

Приложение:
//-----------------------TextPreviewExtender.cs-------------------------------------------
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using AjaxControlToolkit;

[assembly: System.Web.UI.WebResource("MyCustomExtenders.TextPreviewBehavior.js", "text/javascript")]

namespace MyCustomExtenders
{
[Designer(typeof(TextPreviewDesigner))]
[ClientScriptResource("MyCustomExtenders.TextPreviewBehavior", "MyCustomExtenders.TextPreviewBehavior.js")]
[TargetControlType(typeof(TextBox))]
public class TextPreviewExtender : ExtenderControlBase
{
[ExtenderControlProperty]
[DefaultValue("")]
[IDReferenceProperty(typeof(Label))]
public string TargetLabelID
{
get
{
return GetPropertyValue("TargetLabelID", "");
}
set
{
SetPropertyValue("TargetLabelID", value);
}
}

[ExtenderControlProperty]
[DefaultValue("")]
public string DisabledText
{
get
{
return GetPropertyValue("DisabledText", "");
}
set
{
SetPropertyValue("DisabledText", value);
}
}
}
}
//------------------------------------------------TextPreviewBehavior.js------------------------------------------------------
Type.registerNamespace('MyCustomExtenders');

MyCustomExtenders.TextPreviewBehavior = function(element) {

MyCustomExtenders.TextPreviewBehavior.initializeBase(this, [element]);

this._targetLabelIDValue = null;
this._disabledTextValue = null;

}

MyCustomExtenders.TextPreviewBehavior.prototype = {

initialize : function() {
MyCustomExtenders.TextPreviewBehavior.callBaseMethod(this, 'initialize');

// Initalization code
$addHandler(this.get_element(), 'keyup',
Function.createDelegate(this, this._onkeyup));
this._onkeyup();
},

dispose : function() {
// Cleanup code

MyCustomExtenders.TextPreviewBehavior.callBaseMethod(this, 'dispose');
},

// Property accessors
//
get_TargetLabelID : function() {
return this._targetLabelIDValue;
},

set_TargetLabelID : function(value) {
this._targetLabelIDValue = value;
},

get_DisabledText : function() {
return this._disabledTextValue;
},

set_DisabledText : function(value) {
this._disabledTextValue = value;
},

_onkeyup : function() {

var e = $get(this._targetLabelIDValue);
alert ("!");
if (e) {
var disabled = ("" == this.get_element().value);
//e.disabled = disabled;
if ( this._disabledTextValue) {
if (disabled) {
this._oldValue = e.value;
e.value = this._disabledTextValue;
}
else
{
if(this._oldValue){
e.value = this._oldValue;
}
}
}
}
}

}

MyCustomExtenders.TextPreviewBehavior.registerClass('MyCustomExtenders.TextPreviewBehavior', AjaxControlToolkit.BehaviorBase);
//----------------------------------------------TextPreviewDesigner.cs------------------------------------------------------------------------
using System.Web.UI.WebControls;
using System.Web.UI;

namespace MyCustomExtenders
{
class TextPreviewDesigner : AjaxControlToolkit.Design.ExtenderControlBaseDesigner<TextPreviewExtender>
{
}
}

Обсуждение

Неизвестный
27.10.2009, 06:14
общий
это ответ
Здравствуйте, Verena.
Убедитесь что все параметры контролов на странице заданы корректно. Например, у меня подобная ошибка возникает, если в TargetLabelID экстендера прописать пустую строку.
В приложении пример разметки формы с корректно настроенными контролами и экстендером из приложенного Вами проекта - должно работать!

Приложение:
<form runat="server">
<cc1:TextPreviewExtender ID="TextPreviewExtender1" runat="server"
TargetControlID="TextBox1" DisabledText="Save" TargetLabelID="btnSave">
</cc1:TextPreviewExtender>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="btnSave" runat="server" Text="Save*" />
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
</form>
5
Спасибо за советы :)
Неизвестный
28.10.2009, 01:39
общий
Evnik:
Вообще-то свойство TargetLabelID у меня описано с [IDReferenceProperty(typeof(Label))], т.е. к Label-у привязывается, а не к кнопке, как в оригинальном примере с asp.net и в Вашем примере. Но в целом Ваш ответ понятен, однако я пробовала задавать все свойства, также я пробовала задавать их по умолчанию не null-ом, мне не помогло...
Неизвестный
28.10.2009, 06:43
общий
Verena:
Аттрибут IDReferenceProperty, как я понимаю, служит лишь для предоставления выбора определенного типа контрола, однако не накладывает ограничений при явном указании контрола другого типа. Во всяком случае у меня Ваш экстендер работает как с Label, так и с Button. Однако в случае с Label текст в нем не заменяется на DisabledText, хотя enable/disable работает. В подробности работы скрипта не вникал.
По поводу проблемы могу пока лишь посоветовать определить ее источник, т.е. место в котором возникает исключение. Для этого можно воспользоваться окном Call Stack в Visual Studio (Debug/Windows/Call Stack в режиме отладки), либо в IE8 Developer Tools (Script/Call Stack). Там можно походить по скриптам, посмотреть значения и определить кто же там бросает ArgumentNullException.
Неизвестный
28.10.2009, 18:45
общий
Evnik:
По поводу IDReferenceProperty я как раз в одном месте читала, что такая ошибка может из-за несовпадения типов вылетать.
Что самое печальное, проблема решилась сама собой, то есть после n-ой попытки переподключить экстендер он вдруг почему-то перестал вылетать, хотя ничего в коде я не меняла %) Так что в чём была проблема я так и не поняла... Спасибо за советы :)
давно
Профессор
230118
3054
30.10.2009, 10:43
общий
Evnik:
Напишите в Микрософт. Это незамеченный ими баг.
Форма ответа