在区域内的视图中使用MVC HtmlHelper扩展方法

时间:2013-02-18 18:23:45

标签: c# asp.net-mvc-4 extension-methods html-helper asp.net-mvc-areas

我有一个HtmlHelper扩展方法,它从数据库缓存中提取本地化文本。代码是这样的。 (MVCWeb是我的MVC应用程序的命名空间。)

using System.Web;
using System.Web.Mvc;

namespace MVCWeb.PresentationExtensions
{
    public static class HtmlHelperExtensions
    {
        public static HtmlString GetText(this HtmlHelper Html, string keyword)
        {
            // code to get the text based on the keyword
        }
    }
}

我在观看中使用@using MVCWeb.PresentationExtensions。在〜/ Views文件夹中,调用扩展方法非常有效。

我最近添加了一个区域。我在〜/ Areas / AreaName / Views文件夹中的View文件中使用扩展方法,代码正在编译,它确实有效,但我在IDE中遇到错误。

每次我在“区域”视图中使用@Html.GetText("SomeKeyword")时,错误列表中都会显示以下两个错误。

  • 'System.Web.WebPages.Html.HtmlHelper'不包含'GetText'的定义和最佳扩展方法重载'MVCWeb.PresenationExtension.HtmlHelperExtensions.GetText(System.Web.Mvc.HtmlHelper,string)'一些无效的论点
  • 实例参数:无法从'System.Web.WebPages.Html.HtmlHelper'转换为'System.Web.Mvc.HtmlHelper'

我已经发现在〜/ Views中,@ HTML有以下代码注释:

HtmlHelper<dynamic> WebViewPage<dynamic>.Html 
Gets or sets the System.Web.Mvc.HtmlHelper object that is used to render HTML elements.

在〜/ Area / AreaName / Views中,@ HTML有以下注释:

HtmlHelper WebPage.Html
Gets the System.Web.WebPages.Html.HtmlHelper object that is associated with a page.

作为参考,〜/ Views和〜/ Areas / AreaName / Views中的Web.config文件匹配。这是.NET 4.5上的MVC4应用程序,尚未从以前版本的MVC转换。

  • 在常规视图与区域视图中将@Html定义为不同类型是否正常?
  • 如果IDE显示错误,为什么要正确编译并运行?这是IDE的错误吗?
  • 如何阻止这些错误在IDE中显示?

2 个答案:

答案 0 :(得分:1)

它运行正常,因为您的web.config包含正确的引用,并且它在运行时正确匹配。

这只是区域的一个ide错误。要摆脱它,您可以使用@include将其指定为视图顶部的包含,这将为智能感知提供帮助。

答案 1 :(得分:1)

我遇到了同样的问题,试图将MvcSiteMap助手添加到区域中的视图。

问题在于NuGet包将其名称空间添加到根和视图级别的Web.Config文件中,但不足为奇的是,它不够聪明,无法查找埋在Areas / area_name / Views文件夹中的文件。解决方案只是添加命名空间,例如

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    <add namespace="System.Web.Optimization" />
    <add namespace="System.Web.Routing" />
    <add namespace="FarmingtonCo.CacPortalWeb" />
    <add namespace="MvcSiteMapProvider.Web.Html" />
    <add namespace="MvcSiteMapProvider.Web.Html.Models" />
  </namespaces>
</pages>