2009-12-21 3 views
1

У меня есть приложение WebForms, которое в основном выполнялось на Postbacks. Но теперь я хотел бы использовать jQuery все больше и больше, и я предпочел бы управлять ClientID, чтобы у меня был настоящий селектор «#id» вместо использования «input [id $ = myID]».ASP.NET Webforms, методы управления ClientID

Теперь, поскольку я все еще люблю использовать элементы управления ASP.net (мне нужно работать с ними через CodeBehind), интересно, есть ли хорошие альтернативы?

Данное приложение работает в SharePoint 2007 и 2010, что означает: нет возможности переключиться на ASP.net MVC и b) нет встроенного кода внутри файла .ASPX, что также означает отсутствие возможности динамически строить JavaScript с использованием $("<%= MyControl.ClientID %>). (Да, я знаю, что я могу включить Inline Code в web.config, но я хочу этого избежать)

Один из подходов прямо сейчас - использовать ASP: литералы и полностью построить HTML в CodeBehind, но это кажется скорее неуклюжий. Любой другой подход, или мне не повезло?

ответ

3

Вы можете переопределить генерацию идентификатора клиента так, что ASP.NET не искажать имена управления. Я привел пример в this thread.

Основная идея - переопределить свойства ClientID и UniqueID в классе потомков, а затем использовать этот класс вместо встроенного элемента управления ASP.NET. Представленный пример демонстрирует текстовое поле, но это относится к любому серверному элементу управления.

Главное в этом подходе состоит в том, что ему не требуется передавать идентификаторы разметки. Однако вам необходимо убедиться, что вы не создаете несколько компонентов с одинаковым идентификатором (например, в ретрансляторе или списке).

Также: НИКОГДА НИКОГДА НИКОГДА не должно быть сгенерируйте свою разметку в виде кода. Используйте список, ретранслятор или другой элемент управления. Создание разметки в коде позади делает для кошмара обслуживания, особенно когда дизайнер (кто-то, кто разбирается в графике, HTML и CSS, но не обязательно C#), должен внести изменения в вашу работу. Сделайте себе одолжение и сохраните разметку в ASPX, где она принадлежит, и код в .cs.

Update частичный образец кода из ссылочного нити:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 


namespace MyControls 
{ 
    public class Textbox : System.Web.UI.WebControls.TextBox 
    { 
     public override string ClientID 
     { 
      get 
      { 
       return ID; 
      } 

     } 

     public override string UniqueID 
     { 
      get 
      { 
       return ID; 
      } 
     } 

    } 

    public class Button : System.Web.UI.WebControls.Button 
    { 

     public override string ClientID 
     { 
      get 
      { 
       return ID; 
      } 

     } 

     public override string UniqueID 
     { 
      get 
      { 
       return ID; 
      } 
     } 
    } 
} 
+0

Никогда не говори никогда. Выделение разметки не является неприятным, если вы не ставите стиль там. –

4

Это очень распространенная жалоба с помощью ASP.NET Web Forms, и, к сожалению, вы не можете с этим поделать. .NET 4 даст нам больший контроль над поколением ClientID, но до тех пор он неизбежно будет головной болью.

Одним из вариантов было бы построить строку JSON в коде, содержащую некоторые из идентификаторов клиента, которые вам нужны, и использовать ClientScript.RegisterClientScriptBlock, чтобы выставить ее на стороне клиента. Это некрасиво, но это лучше, чем генерация HTML в коде.

Код За:

String jsonClientIDs = "window.ClientIDs = { " + 
         "oneControlClientID: '" + oneControl.ClientID + "'," + 
         "twoControlClientID: '" + twoControl.ClientID + "'" + 
         "}"; 

Page.RegisterClientScriptBlock(GetType(), "ClientIDs", jsonClientIDs, true); 

Javascript:

function myFunction() 
{ 
    $(ClientIDs.oneControlClientID).hide(); 
    $(ClientIDs.twoControlClientID).show(); 
} 
Смежные вопросы