在@ Url.Action()routevalues中使用enum

时间:2013-02-20 15:10:26

标签: c# razor asp.net-mvc-4

这个问题只是一个问题。我在页面上有一组链接,它们实际上都指向相同的控制器方法 - 它们之间的区别在于它们各自向该方法传递不同的值,以便后续过程略有不同。我碰巧已经定义了一个枚举对应于传递的可能值,所以我没有想到,我这样做了:

@Url.Action("QueryStepTwo", new { type = QueryType.UserRecords })

并且惊喜地发现没有任何东西获得红色下划线。我点击编译并导航到该页面进行验证,向CS0103显示错误消息:“当前上下文中不存在名称'QueryType'”。在编辑器中,QueryType是语法突出显示的,当我输入时,IntelliSense会提供选项列表。

我假设这只是一个VS / IntelliSense只是有点过于聪明并且知道实际页面解析/渲染引擎无法实现的情况?将枚举强制转换为字符串或int值也无济于事,所以我猜测这与执行事物的顺序有关;更具体地说,当Razor看到页面时,枚举超出了范围。有没有办法在这样的URL帮助器中使用枚举,尤其是不需要将枚举定义为视图模型的成员?我不喜欢在整个地方使用魔法弦;他们太容易受到错别字和蠢事的影响。

1 个答案:

答案 0 :(得分:1)

确保完全限定定义此枚举的命名空间:

@Url.Action("QueryStepTwo", new { type = SomeNamespace.QueryType.UserRecords })

或者如果您不想这样做,您还可以在Razor视图的顶部添加@using指令:

@using SomeNamespace

如果您想对所有Razor视图全局执行此操作,可以将此命名空间添加到<namespaces>中的~/Views/web.config节点(不要与~/web.config混淆):

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.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.Routing" />

        <add namespace="SomeNamespace" />
      </namespaces>
    </pages>
</system.web.webPages.razor>

就Razor观点中的Intellisense而言,这不是值得信赖的东西。希望微软能够在未来的版本中对其进行改进。

相关问题