Drupal хорош для начала работы, но Вы проводите больше времени, 'отменяя', чем фактическое добивание цели. Это изменялось особенно с выпуском Drupal 6, и быть справедливым это более очевидно во внесенных модулях.
Руководящие миграции являются также проблемой, как сказал Sean. Я все еще не знаю о хорошем методе перемещения изменений от dev сайта до живого.
я не уверен, что существует что-либо, что я изменил бы в текущем ядре, и большинство дефицитов работается на. Работа потребностей управления изображением, администраторский интерфейс по умолчанию немного нарушен, делая более сложные разметки, не получая представления/панели, и т.д. включенный мог использовать некоторую работу.
Во-первых, вам нужно определить событие на вашем UserControl
, которое позволяет Page
, содержащему UserControl
регистрировать и обрабатывать событие. Например:
public partial class MyUserControl : System.Web.UI.UserControl
{
// Event for page to handle
public event EventHandler DivClicked;
protected virtual void OnDivClicked(EventArgs e)
{
if (DivClicked != null)
DivClicked(this, e);
}
protected void Page_Load(object sender, EventArgs e)
{
// Page Load Code goes here
}
}
Примечание:
Следующая часть была бы проще, если бы вы использовали элемент управления, поддерживающий обратную передачу. Однако, поскольку вы хотите использовать div
, я объясню, как заставить div
выполнять обратную передачу. Я хотел бы поблагодарить Мэтью Нолтона за это решение.
Итак, в методе Page_Load
элемента UserControl
вам нужно добавить onClick
для вызова функции JavaScript __ doPostback ()
ASP.NET, которая вызывает сервер обратно для вашего div
. Это то, что дает div
возможность обратной передачи на сервер. Кроме того, чтобы определить, какой элемент управления вызвал обратную передачу, я предоставил div
ClientId
вместе с некоторыми символами, чтобы отличить мою обратную передачу от других элементов управления. Помните, когда вы определяли div
в. ascx, ему должен быть назначен id
и установлен runat = "server"
, чтобы он был доступен на стороне сервера.
Хорошо, теперь, добавив атрибут onclick
к div
, он будет выполнять обратную передачу на сервер при каждом нажатии. Итак, когда обратная передача вызывает вызов Page_Load
, я проверяю, не вызвал ли обратную передачу div
. Если да, то я вызываю событие UserControl
DivClicked
, которое будет обработано страницей.
public partial class MyUserControl : System.Web.UI.UserControl
{
// Event Definition and Raising methods
...
protected void Page_Load(object sender, EventArgs e)
{
// @@@@ will denote this is an argument I provided.
string arg = "@@@@" + divClickableDiv.ClientID;
// Add postback method to onClick
divClickableDiv.Attributes.Add("onClick",
Page.ClientScript.GetPostBackEventReference(divClickableDiv, arg));
if (IsPostBack)
{
// Get event arguments for post back.
string eventArg = Request["__EVENTARGUMENT"];
// Determine if postback is a custom postback added by me.
if (!string.IsNullOrEmpty(eventArg) && eventArg.StartsWith("@@@@"))
{
// Raise the click event for this UserControl if the div
// caused the post back.
if (eventArg == arg)
OnDivClicked(EventArgs.Empty);
}
}
}
}
Это должно сделать это для UserControl
, теперь все, что вам нужно. необходимо зарегистрироваться для события DivClicked
на странице.
К сожалению, вы не получите поддержки во время разработки для регистрации на событие. Однако вы все равно можете добавить код на страницу ASPX. На странице, куда вы помещаете свой UserControl
, добавьте атрибут к UserControl
под названием OnXXX
, где XXX - это событие имени. Итак, для моего примера выше я бы определил свой UserControl
на странице, который будет выглядеть так:
<uc1:MyUserControl ID="MyUserControl1" runat="server" OnDivClicked="MyUserControl1_DivClicked" />
Теперь вы добавляете свой код обработчика в файл выделенного кода страницы Page
(при условии, что ваш используя выделенный код) следующим образом:
public partial class MyPage : System.Web.UI.Page
{
// Called whenever div in MyUserControl is clicked.
protected void WebUserControl1_DivClicked(object sender, EventArgs e)
{
// Handle Div click event here.
}
}
Это должно сработать. Надеюсь, этот пост вам поможет.
<div runat="server" onserverclick="MyClickHandler">
...
</div>