Я попытался отделить JavaScript в пользовательском элементе управления поисковой сетки от HTML в файле .ascx. В первой итерации я использовал функцию jQuery (document) .onReady, чтобы присоединить мою инициализацию.
Проблема в том, что теги <% =%>, используемые в селекторах jQuery, не были интерполированы правильно, а элементы управления, на которых действовал javascript, не были найдены в селекторах jQuery.
Затем я попытался создать объект json при инициализации страницы и записать его, используя метод asp.net Page.ClientScript.RegisterClientScriptBlock. Это работало нормально, но с недостатками: жестко связал имя объекта json и ключи в файле asp.net и файле javascript. Это невыгодно, поскольку в настоящее время существует «две точки правды», которые необходимо поддерживать, и, кроме того, существует вероятность конфликта имен на последней отрисованной странице.
Самым элегантным решением в рамках asp .net и использованием jQuery является создание поведения сценария ajax в javascript. Затем в коде asp зарегистрируйте свойства поведения сценария в методе GetScriptDescriptors () интерфейса IScriptControl, добавив идентификатор ClientID серверного элемента управления в качестве свойства в дескриптор сценария.
// Ajax Javacsript Code below:
Type.registerNamespace('SearchGrid');
// Define the behavior properties
//
ButtonBehavior = function() {
ButtonBehavior.initializeBase(this);
this._lnkSearchID = null;
}
// Create the prototype for the behavior
//
//
SearchGrid.ButtonBehavior.prototype = {
initialize: function() {
SearchGrid.ButtonBehavior.callBaseMethod(this, 'initialize');
jQuery('#' + this._lnkSearchID).click(function() { alert('We clicked!'); });
},
dispose: function() {
SearchGrid.ButtonBehavior.callBaseMethod(this, 'dispose');
jQuery('#' + this._lnkSearchID).unbind();
}
}
// Register the class as a type that inherits from Sys.Component.
SearchGrid.ButtonBehavior.registerClass('SearchGrid.ButtonBehavior', Sys.Component);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
Код Asp .Net ниже:
public partial class SearchGrid : System.Web.UI.UserControl, IScriptControl
{
// Initialization
protected override void OnPreRender(EventArgs e)
{
if (!this.DesignMode)
{
// Test for ScriptManager and register if it exists
ScriptManager sm = ScriptManager.GetCurrent(Page);
if (sm == null)
throw new ApplicationException("A ScriptManager control must exist on the current page.");
sm.RegisterScriptControl(this);
}
base.OnPreRender(e);
}
protected override void Render(HtmlTextWriter writer)
{
if (!this.DesignMode)
sm.RegisterScriptDescriptors(this);
base.Render(writer);
}
// IScriptControl Members
public IEnumerable<ScriptDescriptor> GetScriptDescriptors()
{
ScriptBehaviorDescriptor desc = new ScriptBehaviorDescriptor("SearchGrid.ButtonBehavior", this.ClientID);
desc.AddProperty("lnkSearchID", this.lnkSearch.ClientID);
yield return desc;
}
public IEnumerable<ScriptReference> GetScriptReferences()
{
ScriptReference reference = new ScriptReference();
reference.Path = ResolveClientUrl("SearchGrid.ButtonBehavior.js");
return new ScriptReference[] { reference };
}
}
Преимущество здесь в том, что вы можете создавать автономные повторно используемые элементы управления с поведением javascript, содержащимися в его отдельном файле (или как веб-ресурс), при передаче состояния и контекста, которые в противном случае могли бы быть интерполированы с углом, процентами, равно синтаксису , необходимые для jQuery, чтобы сделать свою работу.