ASP.NET Intellisense在属性中不起作用

时间:2010-05-25 13:49:44

标签: asp.net intellisense

似乎Intellisense在ASP.NET页面中的属性中不起作用。我非常喜欢强类型,因为我喜欢Intellisense,因此我通常会确保绑定到ASP.NET中的强类型对象:

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

Intellisense只能在div的主体内工作,但无论我做什么,它都无法设置该类属性。这非常烦人,因为属性在HTML中非常重要,而且许多内置控件都会大量使用它们。

我找不到任何关于此的内容,但我无法相信这不是一个非常基本的需求。是否有任何方式让它发挥作用?

4 个答案:

答案 0 :(得分:3)

非常糟糕,Visual Studio 2008/2010无法处理此问题。我真诚地希望它能在下一个版本中出现。但是有一些扩展可以帮助到这里。

刚刚尝试过Resharper这个特殊原因并发现它有很大的帮助。 现在我的属性字符串中的语法检查和IntelliSense: - )。我想还有其他的Visual Studio扩展程序可以做到这一点,还没有尝试过。 (Resharper花费了一些,但他们确实有学术和开源开发的替代免费许可。)

答案 1 :(得分:2)

我经常遇到同样的问题,即使在asp.net mvc 2中工作时。通常我只是在类之外输入代码(intellisense工作),然后将这段文本移动到属性中。 :S

答案 2 :(得分:1)

要确保正确的智能感知和强类型,请将数据绑定代码放在代码文件中而不是ASPX页面中。当您输入的对象发生变化时,您会发现您的应用程序更容易支持。您应该在ASPX页面中看到的唯一“黄色”位于顶部。

你的转发器应该是这样的......

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

您的代码文件应如下所示......

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

您还应该考虑使用<asp:Label>代替<div>。然后,您可以使用.CssClass属性而不是.Attributes("class")

答案 3 :(得分:0)

我不确定这真的算是一个答案,但是:我已经将所有新开发转换为Razor,它解决了这个问题,并且在许多其他方面也要好得多。特别是,编译时检查通常要好得多,这样可以更容易地在设计器中而不是在运行时捕获问题。

同样,不是WebForms开发的真正答案,但至少现在还有另一个视图引擎可用。