似乎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中非常重要,而且许多内置控件都会大量使用它们。
我找不到任何关于此的内容,但我无法相信这不是一个非常基本的需求。是否有任何方式让它发挥作用?
答案 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开发的真正答案,但至少现在还有另一个视图引擎可用。