动作参数命名

Posted

技术标签:

【中文标题】动作参数命名【英文标题】:Action Parameter Naming 【发布时间】:2011-01-03 02:08:59 【问题描述】:

使用提供的默认路由,我不得不将我的参数命名为“id”。这对我的很多控制器动作来说都很好,但我想在某些地方使用更好的变量命名。我可以使用某种属性,以便在我的操作签名中拥有更有意义的变量名称吗?

// Default Route:
routes.MapRoute(
  "Default",                                              // Route name
  "controller/action/id",                           // URL with parameters
  new  controller = "Home", action = "Index", id = ""   // Parameter defaults
);

// Action Signature:
public ActionResult ByAlias(string alias)

  // Because the route specifies "id" and this action takes an "alias", nothing is bound

【问题讨论】:

【参考方案1】:

使用[绑定]属性:

public ActionResult ByAlias([Bind(Prefix = "id")] string alias) 
    // your code here

【讨论】:

这是我发现的使用 Bind 的最佳示例!有没有办法也可以在模型属性上进行这项工作?即,方法签名不是具有字符串参数,而是具有一个类作为参数,该类具有如下所示的属性:[Bind(Prefix = "id")]string Alias get; set;?该示例无法编译...我将如何修改它以编译(并且也可以工作)?【参考方案2】:

这仍然有效,您的查询字符串将看起来像“/Controller/ByAlias?alias=something”。

【讨论】:

我猜你是说如果我真的使用 html.ActionLink 来创建我的链接,它仍然有效,那么它会创建一个你所描述的 URL......如果我没有' t 这样做,只需点击 URL /Controller/ByAlias/aliashere - 我可以以某种方式将字符串别名参数绑定到路由中定义的“id”片段吗? 在我的 MVC 版本上,这不起作用。它严格预期 /id - 无法提供 ?alias=val【参考方案3】:

您可以使用您喜欢的任何标识符自定义路线..

routes.MapRoute(
  "Default",                                              // Route name
  "controller/action/alias",                           // URL with parameters
  new  controller = "Home", action = "Index", alias = ""   // Parameter defaults
);

编辑: Here's an overview from the ASP.NET site

【讨论】:

我当然可以,但是如果我仍然希望原来的 /Home/Index/id 工作,我不能很好地定义 /Home/Index/alias 在它之后并期望它永远得到命中。【参考方案4】:

仅仅因为您的路由使用名称“id”作为 ID 变量并不意味着您必须在控制器操作方法中使用相同的名称。

例如,给定这个控制器方法...

public Controller MailerController

    public ActionResult Details(int mailerID)
    
        ...
        return View(new  id = mailerID );
    

...从视图中调用此操作方法...

<%= Html.ActionLink("More Info", "Details", new  mailerID = 7 ) %>

...您可以在控制器操作方法中对 ID 参数使用任何您希望的命名约定。您需要做的就是将新名称解析为默认名称,无论是“id”、“alias”还是其他名称。

上面的例子应该解析为:

<a href="/Mailer/Details/7">More Info</a>

【讨论】:

对我来说(在 MVC 1.0 中)如果我点击 /Mailer/Details/7,mailerID 将始终为 null。一旦我将 int mailerID 更改为 int id(根据路由),它就可以正常工作。 使用id 允许您概括您的路线。如果没有这个,您将需要为 id 的每个命名变体提供一条路由。

以上是关于动作参数命名的主要内容,如果未能解决你的问题,请参考以下文章

如何重命名python蝗虫动作?

提升精神语义动作参数

禁用特定操作的强参数

Struts2 数据标签

在宜搭中使用动作绑定和获取回调函数参数!

CakePHP 中命名参数的路由配置