2010-05-25 9 views
11

Parece que Intellisense simplemente no funciona dentro de los atributos en una página ASP.NET. Me gusta mucho la tipificación estricta, porque me gusta Intellisense, y por lo que generalmente aseguro de unirse a un objeto fuertemente tipado en ASP.NET:ASP.NET Intellisense no funciona en los atributos

<Repeater ID="rep" runat="server"> 
    <ItemTemplate> 
    <div id="mydiv" class="<%# TypedObject.Class %>" runat="server"> 
     <%# TypedObject.Name %> 
    </div> 
    </ItemTemplate> 
</Repeater> 

Intellisense simplemente funciona dentro del cuerpo de la div, pero no importa lo Lo hago no funcionará para establecer ese atributo de clase. Esto es muy molesto, ya que los atributos son bastante fundamentales en HTML, y muchos de los controles integrados los usan en gran medida.

No puedo encontrar nada al respecto, pero no puedo creer que esta no sea una necesidad fundamental. ¿Hay alguna forma de hacer esto para?

+0

¿Qué versión de Visual Studio estás usando? –

+0

Este es VS2008. –

+0

Actualización: Mismo problema en VS2010. Que molesto. –

Respuesta

0

No estoy seguro de que esto realmente cuente como respuesta, pero: Cambié todos los nuevos desarrollos a Razor, que corrige este problema y es mucho mejor en muchas otras formas también. En particular, la verificación del tiempo de compilación en general es mucho mejor, lo que facilita la detección de problemas en el diseñador en lugar de hacerlo en tiempo de ejecución.

Una vez más, realmente no es una respuesta para el desarrollo de WebForms, pero al menos hay otro motor de vista disponible ahora.

1

Para garantizar un Intellisense correcto y un tipado fuerte, coloque su código de enlace de datos en el archivo de código en lugar de la página ASPX. Encontrará que sus aplicaciones son mucho más fáciles de admitir cuando su objeto tipeado cambie. El único "amarillo" que debería ver en su página ASPX está en la parte superior.

Su repetidor debe tener este aspecto ...

<asp:Repeater ID="rep" runat="server"> 
    <ItemTemplate> 
     <div id="mydiv" runat="server" /> 
    </ItemTemplate> 
</asp:Repeater> 

el archivo de código debería tener este aspecto ...

Option Explicit On 
Option Infer On 
Option Strict On 

'Replace this class with your custom typed object' 
Public Class TypedObject 
    Public [Class] As String 
    Public [Name] As String 

    Sub New(ByVal NewClass As String, ByVal NewName As String) 
     Me.Class = NewClass 
     Me.Name = NewName 
    End Sub  
End Class 


Partial Class _Default 
    Inherits System.Web.UI.Page 

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

     'Creating sample data and binding it to the repeater' 
     Dim aData() As TypedObject = {New TypedObject("Class1", "Name1"), New TypedObject("Class2", "Name2")} 

     rep.DataSource = aData 
     rep.DataBind() 
    End Sub 

    Private Sub rep_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rep.ItemDataBound 
     'Do not process headers/footers/separators' 
     Select Case e.Item.ItemType 
      Case WebControls.ListItemType.Item, WebControls.ListItemType.AlternatingItem 
      Case Else 
       Exit Sub 
     End Select 

     'Aquire our datasource for this row' 
     Dim dr = DirectCast(e.Item.DataItem, TypedObject) 

     'Aquire the control to bind (Do this for each control you are binding)' 
     Dim mydiv = DirectCast(e.Item.FindControl("mydiv"), HtmlGenericControl) 

     'bind the control' 
     mydiv.InnerHtml = dr.Name 
     mydiv.Attributes("class") = dr.Class 

    End Sub 
End Class 

También debe considerar el uso de un <asp:Label> en lugar de un <div>. Luego puede usar la propiedad .CssClass en lugar de .Attributes("class").

+2

Sé que podría hacer esto, pero parece ser el enfoque equivocado por varias razones. Reemplaza una línea de código con al menos 10, y gran parte de ese código es de fundición y otras cosas que son mucho más irritantes que la falta original de Intellisense. Además, sería mucho más difícil hacer cambios más tarde. Si quisiera reemplazar el repetidor con una grilla, tendría que hacer muchos cambios no triviales en el código.Pero lo más importante es que ASP (y WPF) son lo más declarativos posible y tienen el menor código de procedimiento posible. Esto va en la dirección opuesta. –

+1

Prefiero hacer 10 líneas de código con intellisense, que una línea de código sin él. ¿ASP.NET realmente trata de ser tan declarativo como sea posible? No temas al código subyacente. :-P – dave

+0

Supongo que creo que uno debe ser lo más declarativo posible, pero solo porque una vez que declaras la plantilla, cualquier otro * lugar * al que pones algo está menos acoplado, y eso permite que entren errores y hace las cosas más difíciles de entender. Y esas diez líneas de código probablemente también den lugar a más problemas. Realmente, solo necesitan arreglar al diseñador para que funcione de la manera que se supone. FWIW, el diseñador de WPF/Silverlight parece haber solucionado en gran medida este tipo de problema. –

2

Tengo el mismo problema muy a menudo, incluso mientras trabajo en asp.net mvc 2. Por lo general, simplemente tecleo el código fuera de clase (donde intellisense funciona) y luego simplemente muevo ese trozo de texto en atributo. : S

+0

Suspiro, eso es lo que hago también, pero es tan pesado. –

+0

Mismo problema aquí en VS2010. Una vez que está entre comillas dentro de un atributo, no obtengo nada. – jwsample

+0

¿En MVC 2 también? :-(Estaba esperando mejoras en este asunto. – joeriks

3

Es realmente malo que Visual Studio 2008/2010 no maneja esto. Sinceramente espero que llegue en el próximo lanzamiento. Sin embargo, hay extensiones que ayudan aquí.

Acabo de probar Resharper por este motivo en particular y me pareció de gran ayuda. Tanto la comprobación de sintaxis como IntelliSense en mis cadenas de atributos ahora :-). Supongo que hay otras extensiones de Visual Studio que también lo hacen, todavía no lo he intentado. (Resharper cuesta un poco, pero tienen licencias gratuitas alternativas para desarrolladores académicos y de código abierto.)

+0

He oído muchas cosas buenas sobre Resharper , pero nunca lo intenté. De hecho, dejé ASP.NET por un tiempo, pero cuando vuelva a intentarlo, podría probarlo. Gracias. –

+0

¡Salud! (Acabo de recibir una respuesta del apoyo de Coderush sobre esto " No proporcionamos nuestra propia ventana IntelliSense. Estamos usando la ventana incorporada para este propósito. Por lo tanto, me temo que nuestras herramientas no pueden ayudar en esta situación "). – joeriks

Cuestiones relacionadas