C# 动作参数命名

C# 动作参数命名,c#,asp.net-mvc,asp.net-mvc-routing,C#,Asp.net Mvc,Asp.net Mvc Routing,使用提供的默认路由,我被迫将参数命名为“id”。这对于我的许多控制器操作来说都很好,但是我想在某些地方使用更好的变量命名。是否有某种类型的属性可供我使用,以便在动作签名中具有更有意义的变量名 // Default Route: routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}",

使用提供的默认路由,我被迫将参数命名为“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
}

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

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

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

编辑:

仅仅因为路由对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>

使用[Bind]属性:

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

我猜你是说它仍然有效,这意味着如果我真的使用了Html.ActionLink来创建我的链接,那么它将创建一个URL,正如你所描述的。。。如果我没有这样做,只是点击这里的URL/Controller/ByAlias/alias——我可以将字符串alias参数绑定到路由中定义的“id”部分吗?在我的MVC版本中,这不起作用。它严格地期望/{id}-不能提供?alias=valI当然可以,但是如果我仍然希望原始的/Home/Index/id工作,我不能很好地定义/Home/Index/alias,并期望它能被命中。对我来说(在MVC 1.0中),如果我点击/Mailer/Details/7,mailerID总是会导致null。只要我将int-mailerID更改为int-id(根据路线),它就可以正常工作。使用
id
可以概括路线。如果没有这个,您将需要为id的每个命名变体使用一个路由。这是我发现的使用绑定的最好示例!是否有一种方法也可以在模型属性上执行此操作?i、 e.方法签名没有字符串参数,而是有一个类作为参数,其属性如下:
[Bind(Prefix=“id”)]string Alias{get;set;}
?那个例子没有编译。。。我将如何修改它以编译(并工作)?