ASP MVC路由没有操作

时间:2012-05-31 19:17:53

标签: c# asp.net-mvc

我想在url中省略这个动作,因为我不认为这是一个宁静的方法。默认路由应为:

"{controller}/{id}"

然后调用与所使用的HTTP方法相对应的操作。例如,我正在装饰像这样的PUT动作:

[HttpPut]
public ActionResult Change()
{
    return View();
}

然而,当我说这个时,我得到了404.所以我做错了,之前有人试过这种方法吗?

我正在使用MVC4测试版。

这就是我正在设置的路线:

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{id}",
        defaults: new { controller = "Home", action = "Index", id = RouteParameter.Optional }
    );

3 个答案:

答案 0 :(得分:5)

[HttpPut]
[ActionName("Index")]
public ActionResult Change()
{
    return View();
}

MVC中的操作方法选择器只允许您为同名方法最多使用2个操作方法重载。我想知道你来自哪里,想要只有{controller} / {id}作为URL路径,但你可能会以错误的方式解决它。

如果您的控制器只有2个操作方法,比如说GET为1,PUT为1,那么你可以像上面一样命名你的两个动作,或者像这样:

[HttpPut]
public ActionResult Index()
{
    return View();
}

如果控制器上有两个以上的方法,则可以为其他操作创建新的自定义路由。您的控制器可能如下所示:

[HttpPut]
public ActionResult Put()
{
    return View();
}

[HttpPost]
public ActionResult Post()
{
    return View();
}

[HttpGet]
public ActionResult Get()
{
    return View();
}

[HttpDelete]
public ActionResult Delete()
{
    return View();
}

...如果你的global.asax看起来像这样:

routes.MapRoute(null,
  "{controller}/{id}", // URL with parameters
  new { controller = "Home", action = "Get", id = UrlParameter.Optional },
  new { httpMethod = new HttpMethodConstraint("GET") }
);

routes.MapRoute(null,
  "{controller}/{id}", // URL with parameters
  new { controller = "Home", action = "Put", id = UrlParameter.Optional },
  new { httpMethod = new HttpMethodConstraint("PUT") }
);

routes.MapRoute(null,
  "{controller}", // URL with parameters
  new { controller = "Home", action = "Post", id = UrlParameter.Optional },
  new { httpMethod = new HttpMethodConstraint("POST") }
);

routes.MapRoute(null,
  "{controller}/{id}", // URL with parameters
  new { controller = "Home", action = "Delete", id = UrlParameter.Optional },
  new { httpMethod = new HttpMethodConstraint("DELETE") }
);

routes.MapRoute(
  "Default", // Route name
  "{controller}/{id}", // URL with parameters
  new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

...这些新的4条路由都有相同的URL模式,但POST除外(因为你应该POST到集合,但是PUT到特定的id)。但是,不同的HttpMethodConstraints只告诉MVC路由以匹配httpMethod对应的路由。因此,当有人将DELETE发送到/ MyItems / 6时,MVC将不匹配前3条路线,但会匹配第4条路线。同样,如果有人向/ MyItems / 13发送PUT,MVC将不匹配前2条路线,但会与第3条路线匹配。

一旦MVC匹配路由,它将使用该路由定义的默认操作。因此,当有人发送DELETE时,它将映射到控制器上的Delete方法。

答案 1 :(得分:2)

考虑使用AttributeRouting nuget包。它支持restful conventions

答案 2 :(得分:1)

如果您正在使用MVC4 Beta,为什么不使用WebAPI?

除此之外,我不认为路由引擎会查找各种HTTP动词......所以,你有点卡住了。除非你为所有这些方法重载一个Action方法并执行此操作:

routes.MapRoute(
  "Default", // Route name
  "{controller}/{id}", // URL with parameters
  new { controller = "Home", action = "Restifier", id = UrlParameter.Optional }
);