【问题标题】:How do I remap an MVC action parameter to another parameter name?如何将 MVC 操作参数重新映射到另一个参数名称?
【发布时间】:2016-05-10 22:32:43
【问题描述】:

我必须实现一个像这样调用的 MVC 操作:

http://address/Controller/MyAction?resName=name

它被硬编码为传递resName 的第三方调用。所以天真的方法是有这样的动作:

ActionResult MyAction( String resName )
{

但我认为拥有一个名为resName 的参数并不酷,我更愿意将其命名为resourceName。如果我只是重命名参数 MVC 参数映射不再起作用,并且在调用我的操作时我总是将 resourceName 设置为 null

我试过这样BindAttribute

ActionResult MyAction( [Bind(Include="resName")] String resourceName )

但每次调用我的操作时,resourceName 仍然是 null

如何重新映射我的参数名称?

【问题讨论】:

    标签: c# .net asp.net-mvc-3


    【解决方案1】:

    Prefix 是你需要的:

    ActionResult MyAction( [Bind(Prefix="resName")] String resourceName )
    

    但是,http://address/Controller/MyAction?resourceName=name 不适用于该设置。

    【讨论】:

      【解决方案2】:

      另一个选择是使用ActionParameterAlias 库。它的好处是给定参数的两个名称都可以使用。

      例如

      using ActionParameterAlias;
      //...
      
          [ParameterAlias("resourceName", "resName", Order = 1)]
          ActionResult MyAction( String resourceName )
      

      然后像http://address/Controller/MyAction?resourceName=name http://address/Controller/MyAction?resName=name 这样调用控制器都可以正常工作。

      【讨论】:

      • 不幸的是,如果您在应用程序的某处使用 DateTime 类型的属性并注册全局过滤器,则 ActionParameterAlias 会失败。过滤器正在遍历所有属性及其属性等,并且 DateTime.Date 是 DateTime 类型,这会导致无限递归。可能会发生在递归使用类的任何层次结构中。使用 nuget 包会杀死应用程序而不会说明问题出在哪里,因此在当前版本(6.0.0)中使用起来太危险且不稳定。
      猜你喜欢
      • 1970-01-01
      • 2012-03-15
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 2014-03-12
      相关资源
      最近更新 更多