在asp.net mvc 3中创建和使用DropDown自定义扩展

时间:2013-05-23 08:40:04

标签: c# asp.net-mvc-3 razor extension-methods

我认为这将是一项标准任务,但我遇到了很多困难,所以我寻求帮助。

我有一个下拉,我在我的视图中密集使用,现在我有很多@Html.DropDown()具有相同的逻辑,我认为这是一个用自定义html扩展替换它的好地方。

而不是描述我的项目结构,我只是发布它的截图:

Project Structure

所以在HtmlExtensions.cs中,我创建了一个方法,我认为我需要从网上的某个例子中查看。该方法如下所示:

public static MvcHtmlString YesNoNotApplicableDDown(this HtmlHelper html)
        {
            return MvcHtmlString.Create("<select class=\"YesNoNotApplicable\"> <option value=\"1\">Yes</option> <option value=\"2\">No</option><option value=\"3\">NotApplicable</option></select>");
        }

然后我在web.config下的Views下添加名称空间:

<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.Routing" />
        <add namespace="MCSResources" />
        <add namespace="MaintenanceCheckSystem.Utils.HtmlExtensions" />
      </namespaces>
    </pages>

事实上,我在开始时尝试使用和不使用项目名称,所以我也测试了这个:

<add namespace="Utils.HtmlExtensions" />

然后在我的一个观点中,我尝试@Html.Ye..,但我没有得到任何提示,当我检查我的自定义方法时不存在。我不知道我是否遗漏了某些东西或者我做错了什么(也许两者都有),所以我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

您可以尝试在web.config中注册此命名空间

<add namespace="MaintenanceCheckSystem.Utils" />

在视图中调用您的助手:

@HtmlExtensions.YesNoNotApplicableDDown()

答案 1 :(得分:1)

初步答案

您的扩展类是公共静态方法吗?您的示例代码未显示类定义。

这是requirements for extension methods之一。

更新

你说你已经添加了这样的命名空间:

<add namespace="Utils.HtmlExtensions" />

但这真的是命名空间吗?命名空间不仅仅是这样:

<add namespace="MaintenanceCheckSystem.Utils" />

classname不应包含在using语句中。

如果您在web.config中注册名称空间,也没有类名。

答案 2 :(得分:0)

@using MaintenanceCheckSystem.Utils.HtmlExtensions
你的.cshtml文件中的

UPD @using MaintenanceCheckSystem.Utils