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, и многие из встроенных элементов управления используют их сильно.
Я ничего не могу найти об этом, но я не могу поверить, что это не очень фундаментальная потребность. Есть ли любой способ заставить это работать?
Ответы
Ответ 1
Я не уверен, что это действительно считается ответом, но: я переключил всю новую разработку на Razor, которая исправляет эту проблему и намного лучше и многими другими способами. В частности, проверка времени компиляции в целом намного лучше, что упрощает поиск проблем в дизайнере, а не во время выполнения.
Опять же, на самом деле это не ответ для разработки WebForms, но, по крайней мере, теперь доступен еще один механизм просмотра.
Ответ 2
очень плохо, что Visual Studio 2008/2010 не справляется с этим. Я искренне надеюсь, что это придет в следующем выпуске. Однако есть расширения, которые помогают здесь.
Просто попробовал Resharper по этой причине и нашел, что это очень помогает. И синтаксическая проверка, и IntelliSense в моих строках атрибутов теперь: -). Я предполагаю, что есть другие расширения Visual Studio, которые делают это, а еще нет. (Resharper стоит немного, но у них есть альтернативные бесплатные лицензии для академических разработчиков и разработчиков с открытым исходным кодом.)
Ответ 3
У меня такая же проблема очень часто, даже во время работы в asp.net mvc 2. Обычно я просто набираю код вне класса (где работает intellisense), а затем просто перемещает этот фрагмент текста в атрибут.: S
Ответ 4
Чтобы обеспечить надлежащую Intellisense и сильную типизацию, поместите свой код привязки данных в файл кода вместо страницы 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")
.