chromiumwebbrowser - cefsharp winforms c#
¿Puedo dejar de comer identificaciones de.NET? (10)
Actualmente soy desarrollador de arquitectura de información y JavaScript en el comercio, pero recientemente volví a la codificación de back-end. Y, al tratar de integrar un prototipo de HTML y trabajar con nuestro CMS basado en C #, me he equivocado con nuestros programadores sobre los atributos de HTML ID reescritos arbitrariamente por .NET para los elementos de formulario.
Puedo entender el razonamiento basado en el código para .NET que cambian los ID, pero el hecho de que ya no se puedan usar ID al tratar de desarrollar, por ejemplo, las interfaces mejoradas jQuery está causando cierta fricción. ¿Qué puedo hacer para evitar esto?
Intenté usar el atributo de clase en su lugar, pero eso es realmente horrible, no para qué sirve, y no soluciona el problema de .NET que efectivamente cambia la fuente representada sobre la marcha. También significa que CSS es menos útil ahora y menos eficiente de crear y mantener.
Cualquier consejo o sugerencia muy apreciada, cualquier cosa por unas noches menos sin dormir ...
Mire ASP.Net MVC - se dirige a las jerarquías de objetos over-kill que ASP.Net genera de forma predeterminada.
Este sitio está escrito en MVC (creo): mire su estructura. Si estuviera trabajando en un nuevo proyecto en este momento lo consideraría primero
Si está atascado con ASP.Net básico, tenga cuidado de anular ClientID y UniqueID: tiende a romper muchos controles web.
La mejor forma que he encontrado es pasar el ClientID ilegible al Javascript.
Personalmente, utilizo un conjunto de métodos que he desarrollado para enlazar la "magia" de ASP.NET del lado del servidor (aún no he usado las cosas de MS MVC) y mi código del lado del cliente debido a la desaparición de las identificaciones que ocurren . Aquí hay solo uno que puede o no ser útil:
public void RegisterControlClientID(Control control)
{
string variableDeclaration = string.Format("var {0} = /"{1}/";", control.ID, control.ClientID);
ClientScript.RegisterClientScriptBlock(GetType(), control.ID, variableDeclaration, true);
}
Por lo tanto, en su código del lado del servidor, simplemente llame a esto y pase la instancia de un control para el cual desea usar un nombre más amigable. En otras palabras, durante el tiempo de diseño , puede tener un cuadro de texto con el ID de "m_SomeTextBox" y desea poder escribir su JavaScript con ese mismo nombre; simplemente debe llamar a este método en su código del lado del servidor:
RegisterControlClientID(m_SomeTextBox);
Y luego en el cliente se representa lo siguiente:
var m_SomeTextBox = "ctl00_m_ContentPlaceHolder_m_SomeTextBox";
De esta forma, todos los códigos JavaScript pueden ignorar lo que ASP.NET decide nombrar a la variable. Por supuesto, hay algunas advertencias sobre esto, como cuando tienes múltiples instancias de un control en una página (debido al uso de múltiples instancias de controles de usuario que tienen una instancia de m_SomeTextBox dentro de ellas, por ejemplo), pero generalmente este método puede ser útil para sus necesidades más básicas.
Puede extender los controles .net y hacer que devuelvan identificaciones reales cuando se invocan propiedades relacionadas.
ClientID es el atributo id y UniqueID es el atributo de nombre de los elementos html. Por lo tanto, cuando crea un cuadro de texto como el siguiente y usa este en lugar del cuadro de texto en el marco, hace que los atributos id y name rindan igual que el ID del lado del servidor.
public class MyTextBox : TextBox
{
public override string ClientID { get { return ID; } }
public override string UniqueID { get { return ID; } }
}
Para utilizar este nuevo control de usuario, básicamente registre este control como lo haría con un control de usuario personalizado (lo que puede hacer es en web.config para que no tenga que hacerlo en todas sus páginas):
<%@ Register Assembly="MyLibrary" NameSpace="MyLibrary.WebControls" TagPrefix="MyPrefix" %>
Y úsalo como si usaras un cuadro de texto:
<MyPrefix:MyTextBox ID="sampleTextBox" runat="server" />
Un método es anular el ID manualmente:
public override string UniqueID
{
get { return this.ID; }
}
public override string ClientID
{
get { return this.ID; }
}
Rick Strahl escribió una publicación en el blog con más información sobre ese enfoque.
Lo que suelo hacer es crear una función general que reciba el nombre del campo. Agrega el prefijo "asp.net" habitual y devuelve el objeto.
var elemPrefix = ''ctl00-ContentPlaceHolder-''; //replace the dashes for underscores
var o = function(name)
{
return document.getElementById(elemPrefix + name)
}
Con eso puedes usar este tipo de llamadas en jQuery
$(o(''buttonId'')).bind(''click'', function() { alert(''hi); });
Si está utilizando jQuery, tiene muchos selectores de CSS y jQuery custome selectores a su disposición para orientar los elementos en su página. Por lo tanto, en lugar de seleccionar un botón de enviar por su id, puede hacer algo como:
$(''fieldset > input[type="submit"]'').click(function() {...});
Definitivamente no desea codificar el ID generado por asp.net en su CSS, porque puede cambiar si reorganiza las cosas en su página de tal forma que su árbol de control cambie.
Tiene razón en que los ID de CSS tienen su lugar, por lo que ignoraría las sugerencias de solo usar clases.
Los diversos hacks de javascript descritos aquí son excesivos para un pequeño problema. Así que hereda de una clase y anula la propiedad de ID. Y ciertamente no es útil sugerir cambiar a MVC cuando todo lo que quiere hacer es refactorizar algunos CSS.
Solo tiene divs y span separados a los que se dirige con CSS. No meta los controles ASP.NET directamente si desea usar ID.
<div id="DataGridContainer">
<asp:datagrid runat=server id="DataGrid" >
......
<asp:datagrid>
</div>
Puedo ver cómo el sistema .NET se siente menos intuitivo, pero dale una oportunidad. En mi experiencia, en realidad termina creando un código más limpio. Por supuesto
<asp:button id="ImAButton" runat="server">Click Me</asp:button>
<script type="text/javascript">
var buttonId = <%=ImAButton.ClientId%>
$(buttonId).bind(''click'', function() { alert(''hi); });
</script>
funciona bien. Pero esto se resiente de no ser modular. Lo que realmente quieres es algo como esto:
<script type="text/javascript">
function MakeAClick(inid)
{
$(inid).bind(''click'', function() { alert(''hi); });
}
</script>
y luego con tu código en el lado java o en el lado C # al que llamas MakeAClick. Por supuesto, en el lado C # tiene más sentido, usted solo ClientID allí.
Tal vez este es el verdadero problema con el código que está revisando.
La respuesta corta es no, con formularios web el ID siempre se puede volver a escribir dependiendo de la anidación del elemento. Puede obtener acceso al ID a través de la propiedad ClientID, de modo que pueda establecer los identificadores en variables en un script al final de la página / control y luego ponerlos en jQuery.
algo como esto:
<asp:button id="ImAButton" runat="server">Click Me</asp:button>
<script type="text/javascript">
var buttonId = "<%=ImAButton.ClientId%>";
$("#"+buttonId).bind(''click'', function() { alert(''hi); });
</script>
Es un truco que sé, pero funcionará. (Debo anotar para los no iniciados, estoy usando el método Prototype $ get by id allí)
Un enfoque mucho mejor sería usar ClientIDMode y establecerlo en static
. Incluso puede configurarlo para una página específica o globalmente en el archivo web.config. Entonces nunca tendrá que lidiar con este problema nuevamente y su JQuery es mucho más limpio.
Parte superior de la página:
<%@ Page Title="" ClientIDMode="Static" Language="C#" CodeBehind="..." Inherits="WebApplication1.WebForm2" %>
Solo en control:
<asp:Panel runat="server" ClientIDMode="Static"></asp:Panel>