在@Url.Action()routevalues中使用枚举

本文关键字:枚举 routevalues @Url Action | 更新日期: 2023-09-27 18:00:13

这个问题很简单。我在一个页面上有一组链接,它们实际上都指向同一个控制器方法——它们之间的区别在于,它们每个都向该方法传递不同的值,因此后续过程略有不同。我碰巧已经定义了一个枚举来对应可能传递的值,所以我不假思索地做了这个:

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

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

我假设这只是VS/InIntelliSense有点太聪明的情况,并且知道实际页面解析/呈现引擎无法做到的事情?将枚举强制转换为字符串或int值没有帮助,所以我猜这与执行顺序有关;更具体地说,当Razor看到页面时,枚举已超出范围。有没有一种方法可以在这样的URL帮助程序中使用枚举,尤其是不需要将枚举定义为视图模型的成员的方法?我不喜欢到处用魔术串;他们太容易受到打字错误和愚蠢行为的影响。

在@Url.Action()routevalues中使用枚举

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

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

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

@using SomeNamespace

如果您想为所有Razor视图全局执行此操作,可以将此命名空间添加到~/Views/web.config中的<namespaces>节点(不要与~/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而言,这是不可信任的。希望微软能在未来的版本中改进它。