动作参数命名
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 的每个命名变体提供一条路由。以上是关于动作参数命名的主要内容,如果未能解决你的问题,请参考以下文章