【问题标题】:CSS Intellisense not working for MVC 4 project in Visual Studio 2012 UltimateCSS Intellisense 不适用于 Visual Studio 2012 Ultimate 中的 MVC 4 项目
【发布时间】:2013-04-05 22:22:15
【问题描述】:

已创建全新的 Visual Studio 2012 Ultimate SP2 MVC4 项目,但无法让 CSS 类选择器智能感知工作?

当我输入 <p class="m" .... 我应该让类“myClass”出现在智能感知下拉列表中,但没有任何反应。

我在下面列出的文件是:\Views\Shared\_Layout.cshtml

有什么想法吗?

编辑:已经在全新的 windows 7 系统上重新安装了 VS2012(在 Mac OSX parallels 8 上运行)并且仍然以相同的方式运行。 MVC 3 项目似乎也一样。

安装的扩展:

【问题讨论】:

  • 你有没有偶然得到这个工作?我刚刚在 MVC 中尝试使用 bootstrap 时遇到了同样的问题。
  • 我也有同样的问题...有解决办法吗?

标签: asp.net-mvc-4 visual-studio-2012 intellisense


【解决方案1】:

尝试为 Visual Studio 2012 添加 Web Essentials 2012 扩展:http://visualstudiogallery.msdn.microsoft.com/07d54d12-7133-4e15-becb-6f451ea3bea6?SRC=VSIDE

和/或

尝试添加 Microsoft Web Developer Tools 扩展。

这两个我都有,并且使用你的同一个例子,智能感知就像一个魅力。

【讨论】:

  • 感谢您的建议,但这不起作用。我已经安装了 Web Developer Tools 扩展,并且刚刚安装了 Web Essentials 2012,但这并没有什么不同。添加了我在原始问题中安装的屏幕截图。
  • 如果您将 CSS 移动到专用的 .css 文件中,智能感知是否有效?
【解决方案2】:

我尝试了上述所有补救措施和建议。这些都不适用于我的环境。根据微软的说法(在 Microsoft connect 的错误 id 781048 下),他们尚未为 MVC/Razor 文件实现 CSS 类智能感知,但正在努力将其包含在未来的版本中。

我有一个 10 分钟的扩展 VS2012 智能感知的网络广播示例,它添加了一种解决方案,可以将智能感知添加到您的 VS2012 环境中:a Visual Studio Intellisense Extension

网络广播使用 MEF 扩展 Visual Studio 以添加智能感知完成源,该源扫描当前加载的项目以查找 CSS 类名称以添加为智能感知完成集。这里是css补全源类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Language.Intellisense;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Operations;
using Microsoft.VisualStudio.Utilities;
using EnvDTE;
using System.Text.RegularExpressions;
using System.Configuration;
using System.Collections.Specialized;

namespace CssClassIntellisense
{
   internal class cssClassList
   {
      public string cssFileName { get; set; } //Intellisense Statement Completion Tab Name

      public HashSet<string> cssClasses { get; set; }
   }

   internal class CssClassCompletionSource : ICompletionSource
   {
    private CssClassCompletionSourceProvider m_sourceProvider;
    private ITextBuffer m_textBuffer;
    private List<Completion> m_compList;
    private Project m_proj;
    private string m_pattern = @"(?<=\.)[A-Za-z0-9_-]+(?=\ {|{|,|\ )";
    private bool m_isDisposed;

    //constructor
    public CssClassCompletionSource(CssClassCompletionSourceProvider sourceProvider, ITextBuffer textBuffer, Project proj)
    {
        m_sourceProvider = sourceProvider;
        m_textBuffer = textBuffer;
        m_proj = proj;
    }

    public void AugmentCompletionSession(ICompletionSession session, IList<CompletionSet> completionSets)
    {

        ITextSnapshot snapshot = session.TextView.TextSnapshot;
        SnapshotPoint currentPoint = (SnapshotPoint)session.GetTriggerPoint(snapshot);

        if (TargetAttribute.Inside(currentPoint))
        {
            var hash = new List<cssClassList>();
            //read any .css project file to get a distinct list of class names
            if (m_proj != null)
                foreach (ProjectItem _item in m_proj.ProjectItems)
                {
                    getCssFiles(_item, hash);
                }

            //Scan Current Editor's text buffer for any inline css class names 
            cssClassList cssclasslist = ScanTextForCssClassName(
                    "Inline", snapshot.GetText());

            //If file had any css class names add to hash of files with css class names
            if (cssclasslist != null)
                hash.Add(cssclasslist);

            var _tokenSpanAtPosition = FindTokenSpanAtPosition(session.GetTriggerPoint(m_textBuffer), session);

            foreach (cssClassList _cssClassList in hash)
            {
                m_compList = new List<Completion>();
                foreach (string str in _cssClassList.cssClasses.OrderBy(x => x))  //alphabetic sort
                    m_compList.Add(new Completion(str, str, str, null, null));

                completionSets.Add(new CompletionSet(
                    _cssClassList.cssFileName,    //the non-localized title of the tab 
                    _cssClassList.cssFileName,    //the display title of the tab
                    _tokenSpanAtPosition,
                    m_compList,
                    null));

            }
        }
    }

    private ITrackingSpan FindTokenSpanAtPosition(ITrackingPoint point, ICompletionSession session)
    {
        SnapshotPoint currentPoint = (session.TextView.Caret.Position.BufferPosition) - 1;
        ITextStructureNavigator navigator = m_sourceProvider.NavigatorService.GetTextStructureNavigator(m_textBuffer);
        TextExtent extent = navigator.GetExtentOfWord(currentPoint);
        return currentPoint.Snapshot.CreateTrackingSpan(extent.Span, SpanTrackingMode.EdgeInclusive);
    }


    private void getCssFiles(ProjectItem proj, List<cssClassList> hash)
    {
        foreach (ProjectItem _item in proj.ProjectItems)
        {
            if (_item.Name.EndsWith(".css") &&
                !_item.Name.EndsWith(".min.css"))
            {
                //Scan File's text contents for css class names
                cssClassList cssclasslist = ScanTextForCssClassName(
                    _item.Name.Substring(0, _item.Name.IndexOf(".")),
                    System.IO.File.ReadAllText(_item.get_FileNames(0))
                    );

                //If file had any css class names add to hash of files with css class names
                if (cssclasslist != null)
                    hash.Add(cssclasslist);
            }
            //recursively scan any subdirectory project files
            if (_item.ProjectItems.Count > 0)
                getCssFiles(_item, hash);
        }
    }

    private cssClassList ScanTextForCssClassName(string FileName, string TextToScan)
    {

        Regex rEx = new Regex(m_pattern);
        MatchCollection matches = rEx.Matches(TextToScan);
        cssClassList cssclasslist = null;

        if (matches.Count > 0)
        {
            //create css class file object to hold the list css class name that exists in this file
            cssclasslist = new cssClassList();
            cssclasslist.cssFileName = FileName;
            cssclasslist.cssClasses = new HashSet<string>();

        }

        foreach (Match match in matches)
        {
            //creat a unique list of css class names
            if (!cssclasslist.cssClasses.Contains(match.Value))
                cssclasslist.cssClasses.Add(match.Value);
        }

        return cssclasslist;
    }

    public void Dispose()
    {
        if (!m_isDisposed)
        {
            GC.SuppressFinalize(this);
            m_isDisposed = true;
        }
    }
}

}

作为仅供参考,您还可以使用 Resharper 解决此问题。但这是需要为 Visual Studio 购买的第 3 方产品

【讨论】:

  • ReSharper 非常昂贵 - 我自己使用它,但建议一个花费数百美元的工具并不能真正回答 OP 的问题,是吗?特别是因为在这种情况下,没有 ReSharper 也可以获得这种结果。
  • 了解费用。但是,由于以前的答案都没有提供一种解决方案,可以为 VS2012 MVC 剃刀视图提供 CSS 类智能感知。我相信预先知道 MS 尚未实现此功能会有所帮助,以避免认为这是 VS2012 问题。我提到的 ReSharper 是确实有用的选项,尽管需要付出代价。
【解决方案3】:

只是 CSS 智能感知失败还是在整个 Visual Studio 中完全停止?

我遇到了一个类似的问题,影响了我的整个 Visual Studio 2012。这是很久以前的事了,但我记得从我的 appdata 中删除了一个文件夹。看看这个链接,希望它会有所帮助: http://www.haneycodes.net/visual-studio-2012-intellisense-not-working-solved/

【讨论】:

  • 它只是用于 MVC 项目的 CSS 智能感知。 Web 窗体项目似乎工作正常。已尝试删除您建议的文件夹,但没有任何乐趣。也曾多次卸载VS2012并重新安装但仍然无法正常工作。
【解决方案4】:

你不会在 VS2012 中为 Razor 视图获得 CSS 智能感知。有一种使用智能感知的解决方法。只需使用 ASPX 视图引擎创建一个测试视图 (.aspx) 并在其中包含您的 css 文件。现在智能感知将在新的 aspx 视图中工作。您所要做的就是将 css 类从 aspx 复制粘贴到 Razor 视图(.cshtml 或 .vbhtml)。我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    相关资源
    最近更新 更多