Как мне определить порядок отображения сценариев на странице при реализации пользовательских элементов управления с использованием интерфейса IScriptControl?
Вот пример того, что я делаю:
public class MyScriptControl : WebControl, IScriptControl
{
private static ConcurrentBag<ScriptReference> ScriptReferences;
static MyScriptControl()
{
ScriptReferences = new ConcurrentBag<ScriptReference>
{
new ScriptReference { Name = "jquery" },
new ScriptReference { Name = "jquery-ui" },
new ScriptReference { Name = "myscriptcontrol" }
};
ScriptManager.ScriptResourceMapping.AddDefinition("myscriptcontrol",
new ScriptResourceDefinition
{
ResourceAssembly = Assembly.GetCallingAssembly(),
ResourceName = "Path.To.Scripts.myscriptcontrol.js"
}
);
}
public MyScriptControl()
{ }
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
ScriptManager.GetCurrent(Page)
.RegisterScriptControl<MyScriptControl>(this);
}
protected override void Render(HtmlTextWriter writer)
{
// Render UI
}
public IEnumerable<ScriptReference> GetScriptReferences()
{
foreach (var reference in ScriptReferences)
{
yield return reference;
}
}
public IEnumerable<ScriptDescriptor> GetScriptDescriptors()
{
return new ScriptDescriptor[] { };
}
}
Приведенный выше код создает проблему, поскольку он отображает ссылку на сценарий jQueryUI перед отображением ссылки на сценарий jQuery. Если я меняю порядок, скрипты отображаются в правильном порядке:
ScriptReferences = new ConcurrentBag<ScriptReference>
{
new ScriptReference { Name = "myscriptcontrol" },
new ScriptReference { Name = "jquery-ui" },
new ScriptReference { Name = "jquery" }
};
Это отлично подходит для одного элемента управления, но я разрабатываю десятки внутренних элементов управления, некоторые из которых будут зависеть от jQuery или других библиотек, и я хочу быть уверенным, что независимо от того, какая комбинация элементов управления отображается в страница, ссылки на сценарии отображаются в правильном порядке, чтобы избежать проблем с зависимостями.
Помимо выяснения, как определять порядок для зависимых сценариев, не стесняйтесь разбирать любые плохие практики или проблемный код, который вы видите здесь.