¿Hay alguna manera de usar "<%=someObject.ClientID%>" en un archivo javascript externo?
asp.net ascx (8)
¿Hay alguna manera de usar "<% = someObject.ClientID%>" en un archivo javascript externo?
Si uso el código
<%= someObject.ClientID %>
en una etiqueta de script dentro de mi página como (c / p) x, funciona bien. En la página representada, ClientID se resuelve. Sin embargo, si puse un archivo JS externo y simplemente agregué:
No es así ¿Hay alguna manera de hacer esto o me veo obligado a dejar ese código en el archivo as (c / p) x?
Pregunta complementaria: ¿cómo se llama hacer <% = ...%> en su archivo de marcado?
Esto agrega un poco más de HTML pero funciona; envuelve cada control de servidor en un div ...
<div id="myContainer">
<asp:HiddenField ID="hdMyControl" runat="server" /></div>
Establecer el valor de HiddenField en el código detrás
hdMyControl.Value = "something";
Luego, en su archivo JS externo puede obtener el valor del control del servidor
$(document).ready(function () {
var myValue= $(''#myContainer input[type=hidden]'').val();
No estoy seguro de que importe, pero agrego la referencia del script a la página a través del código subyacente utilizando RegisterClientScriptBlock
Esto es totalmente posible.
En su capa de presentación (su página .aspx), cree una referencia de script a una página aspx que contenga su código javascript:
<script src="../MyJavaScriptFile.js.aspx" type=''text/javascript''></script>
Luego, en MyJavaScriptFile.js.aspx, puede escribir lo siguiente:
<%@ Page Language="C#" AutoEventWireup="false" ContentType="text/javascript" %>
<%
CustomPersonObject cpt = new CustomPersonObject();
cpt.firstname = "John";
cpt.lastname = "Smith";
%>
// Start Javascript
var personFirstName = ''<% HttpContext.Current.Response.Write(cpt.name);%>'';
var personLastName = ''<% HttpContext.Current.Response.Write(cpt.lastname);%>''
Una técnica que uso con frecuencia es pasar el valor que necesito evaluar en mi archivo javascript como un parámetro url en la referencia inicial del script:
<script src="../MyJavaScriptFile.js.aspx?username=<% somevalue %>"
type=''text/javascript''></script>
Luego, en MyJavaScriptFile.js.aspx, puedo hacer referencia al valor con
<% Request.QueryString["username"] %>
No es la mejor forma de hacer las cosas, pero hace el trabajo de una manera que mi cerebro de cavernícola puede entender sin tener que recurrir a soluciones extravagantes y códigos adicionales.
La etiqueta del servidor <%= %>
se usa para ingresar el código que se procesa en el servidor.
No puede usar <%= someObject.ClientID %>
en un archivo js externo porque la etiqueta del servidor es una cosa de asp.net y js no sabe de qué se trata.
Si usa ASP.NET 4, puede establecer el ID del cliente en las propiedades del control, lo que lo hace predecible.
Si no usa ASP.NET 4, puede poner esta identificación de cliente en un campo oculto o una variable js en línea.
Me gusta insertar una sola línea de javascript en mi página.
<script type="text/javascript">
Application.init({variable1: "value1", variable2: "value2"...});
</script>
Es una mala práctica tener un montón de javascript renderizado en su página, pero es común que necesite pasar los valores de inicialización a su javascript desde el servidor. Esto le permite hacerlo sin un montón de código innecesario y sin contaminar el espacio de nombres global con funciones de devolución de llamada. Normalmente reemplazo la Application
con un contenedor global específico del proyecto.
No, no funcionará así porque el archivo javascript se está transmitiendo de forma independiente como un archivo separado y no es analizado por ASP.NET en el camino de salida, mientras su archivo aspx está siendo analizado y el motor .NET está reemplazando la etiqueta con el valor real.
Ahora, cuando sus objetos llaman a esas funciones JS, lo que podrían hacer es pasar referencias a sí mismos en la función, o incluso pasar en una lista de diccionario de algún tipo con su propia clave para lo que es el control y el nombre asignado.
Una cosa en qué pensar también: si va a crear un archivo JS independiente de una página ASPX, entonces ese archivo JS no debe suponer en absoluto saber nada sobre los controles específicos del archivo aspx que lo llama, porque más adelante alguien de lo contrario, podría decidir: "Oh, ese es un buen archivo JS, lo incorporaré también" y no funcionará para ellos porque sus objetos no coincidirán con los tuyos. Por lo tanto, el patrón que debe seguir tendrá que ser más genérico, por lo que querrá pasar referencias o listas de identificadores.
Puede crear una función de devolución de llamada vacía en el archivo externo:
var MyCallback = function () { };
Y luego en el asp / cx haz algo como:
MyCallback = function () {return "<%= someObject.ClientID %>";}
Y luego, de vuelta en su archivo externo:
var myClientID = MyCallback();
Si realmente quieres hacer esto, puedes hacer lo siguiente
<%@ Page ContentType="text/javascript" Language="C#" AutoEventWireup="false" %>
<%@ OutputCache Duration="86400" Location="Any" VaryByParam="None" %>
var time = "<%= DateTime.Now.ToString() %>";
alert(time);
Y luego haz referencia en tu página
<script src="Scripts/file.aspx" type="text/javascript"></script>
Nota: cuando se usa el método mencionado, la única forma de pasar los controles de la página de destino ID de cliente es almacenar la ID de cliente como cadena en una propiedad pública y luego hacer referencia a ella usando una nueva instancia de esa página.
Si lo único que hizo que hiciera esto es la identificación del cliente, entonces puede usar la siguiente función ASP.NET 4
<any-tag ID="myCustomId" runat="server" ClientIDMode="Static" />
También puede colocar todos sus ID de cliente en la clase C # y luego serializarlo usando JSON y representarlo en una secuencia de comandos, podría ser una forma inteligente para ASP.NET antes de la versión 4.
Tenga en cuenta que al usar el método de serialización tiene la posibilidad de cambiar cualquier ID de etiqueta sin preocuparse por el uso de elementos de JavaScript, recuerde que esto ni siquiera es posible con ASP.NET 4 ClientIDMode
Ver
Archivo de código de página
public partial class About : System.Web.UI.Page
{
...
protected string GetTagIds()
{
return new JavaScriptSerializer()
.Serialize(new
{
myButton = Button1.ClientID,
myCalendar = Calendar1.ClientID
});
}
...
}
Página-ASPX
<script type="text/javascript">
var IDs = <%= GetTagIds() %>;
</script>
En cualquier sitio
<script type="text/javascript">
IDs.myCalendar.doSomthing...
</script>
Hay otra opción que puede pasar todos los archivos javascript al controlador ASP.NET, pero no lo recomiendo, debido a que solo tiene un archivo javascript que hace que el controlador asp.net ocupado.
Bloques de código
<% código en línea%>
Esta es una definición de código en línea en la que puede ejecutar códigos:
<% Response.Write("Hi"); %>
<% while(i < 0) { %>
<%
Response.Write(i.ToString());
i++;
%>
<%}%>
Nota Debe incluir '';'' al final de cada instrucción al usar código en línea con el lenguaje C #, puede cambiar el idioma en línea utilizando el atributo de idioma de la directiva de página
<% = expresión en línea%>
Esto equivale a llamar a Response.Write your self, ver:
<%= "Hi" %> equals to <% Response.Write("Hi"); %>
Nota: No debe incluir '';'' cuando se usa la expresión en línea
<%: expresión en línea codificada%>
Este es igual a:
Response.Write(HttpUtility.HtmlEncode("<script type="text/javascript">alert(''XSS'');</script>"))
Y se usa por razones de seguridad: XSS , cualquier HTML de entrada a este produce texto codificado en HTML que es seguro para mostrar los contenidos ingresados por el usuario en la página.
Nota: No debe incluir '';'' cuando se utiliza la expresión en línea codificada
<% $ expressionPrefix: expressionField%>
Esta es una expresión que puede usar para vincular valores de ConnectionStrings, Resources y AppSettings
las posibilidades de expressionPrefix es
- Ajustes de Aplicacion
- ConnectionStrings
- Recursos
expressionField es la propiedad de expressionPrefix especificada que necesitas, mira:
// AppSettings
<asp:Label ... Text="<%$ AppSettings: version %>" />
// ConnectionStrings
<asp:SqlDataSource ... ConnectionString="<%$ ConnectionStrings:dbConnectionString %>" />
// Resources
<asp:Label ... Text="<%$ Resources: Messages, Welcome %>" />
Nota: No debe incluir '';'' y puede usar expresiones solo en atributos de controles ASP.Net
<% # expresión de enlace de datos%>
Puede usar esto en cualquier lugar dentro de los controles con soporte de enlace de datos, y generalmente es usado por los métodos Eval y Bind.
<asp:DropDownList SelectedValue=''<%# Bind("CategoryID") %>''
DataSourceID="CategoriesDataSource"
DataTextField="CategoryName"
DataValueField="CategoryID"
runat="Server" />
¿Cuál Eval o Bind?
Usando Bind tiene un enlace bidireccional sobre el atributo especificado del control ASP.NET, vea el menú desplegable mencionado, está utilizando Bind, lo que significa que si el usuario final selecciona un valor y luego envía la página, el menú desplegable no perderá su valor. valor seleccionado.
Usa Eval solo para mostrar datos.
<asp:FormView ...>
<ItemTemplate>
<a href=''Eval("Link")''>Eval("LinkText")</a>
</ItemTemplate>
</asp:FormView>
<% @ directiva de plantilla de texto%>
<%@ Page ...%>
This one is Page Directive
<%@ OutputCache...%>
This one is OutputCache Directive and so on...
Use el identificador de prefijo estándar en los archivos fuente de script:
document.getElementById("ctl00_ContentDetail_textboxelename").value = "";
document.getElementById("ctl00_ContentDetail_radioORcheckboxelename").checked = false;
document.getElementById("ctl00_ContentDetail_elename").style.visibility = "hidden";
var javaele = document.getElementById("ctl00_ContentDetail_elename");
var boolIsChecked = document.getElementById("ctl00_ContentDetail_radioORcheckboxelename").checked;