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").