将字符串参数上的 MVC View Intellisense 警告获取到通用方法

Get MVC View Intellisense warning on string param to general method

Visual Studio 的 Intellisense 知道哪些视图文件可用。

如果我这样写(故意打字错误):

    [HttpGet]
    public ActionResult Create()
    {
        return View("Craete", new KeywordViewModel());
    }

然后它会发牢骚,不划线说"can't resolve View"。 真可爱。

如果我想添加一个间接层,并通过另一个函数传入"Create":

    [HttpGet]
    public ActionResult Create()
    {
        return ArbitraryIndirection("Craete");
    }

    public ActionResult ArbitraryIndirection(string viewName)
    {
        return View(viewName, new KeywordViewModel());
    }

然后我失去了这种行为。 Intellisense 不知道 ArbitraryIndirection 需要一个 View 目标,所以它不会检查。 这一点也不令人惊讶,但却是悲伤

我可以教 Intellisense 更聪明吗?

是否有什么东西告诉 Intellisence 该参数是特殊的(我猜可能是 XML 评论参考或属性?)或者它是否被魔法硬编码到 Intellisence 的某个地方?

我可以在间接视图引用上进行写入时错误检查吗?

我已经有大约一年没有这样做了,但当时是 ReSharper 巧妙地为我验证了观点。

如果您使用的是 ReSharper,则可以在 JetBrains.Annotations 程序集中使用 [AspMvcView] 属性 - 您可以通过 Nuget 将其包含在内。相关指南出现在 jetbrains 网站上 link:

https://blog.jetbrains.com/dotnet/2011/12/07/providing-intellisense-navigation-and-more-for-custom-helpers-in-aspnet-mvc/

[AspMvcAction][AspMvcController] 属性的用法示例如下(请注意,您需要 [AspMvcView] 属性,但我手头没有代码可以使用它)

    public static MvcHtmlString WidgetWrapperAction(this HtmlHelper<dynamic> html, [AspMvcAction] string action, [AspMvcController] string controller, object parameters)
    {
        var routeValueDictionary = new RouteValueDictionary(parameters) { { "area", "AreaName" } };
        var htmlString = html.Action(action, controller, routeValueDictionary);
        if (string.IsNullOrWhiteSpace(htmlString.ToHtmlString()))
        {
            htmlString = html.Action("WidgetLoadFailed", "WidgetLoadFailed", new RouteValueDictionary { { "area", "AreaName" } });
        }
        return htmlString;
    }

希望对您有所帮助。