gpt4 book ai didi

c# - 没有 Action 的 ASP MVC 路由

转载 作者:行者123 更新时间:2023-11-30 14:00:23 25 4
gpt4 key购买 nike

我想省略 url 中的操作,因为我不认为这是一种 Restful 方法。默认路由应该是:

"{controller}/{id}"

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

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

然而,当 cUrl-ing 时,我收到 404。所以我做错了什么,以前有人尝试过这种方法吗?

我正在使用 MVC4 测试版。

这就是我设置路线所做的一切:

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

最佳答案

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

MVC 中的 Action 方法选择器只允许您最多为同名方法重载 2 个 Action 方法。我了解您希望只有 {controller}/{id} 作为 URL 路径的原因,但您可能会以错误的方式进行处理。

如果您的 Controller 只有 2 个操作方法,比如 1 个用于 GET,1 个用于 PUT,那么您可以将这两个操作命名为索引,就像我在上面所做的那样,或者像这样:

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

如果 Controller 上有超过 2 个方法,您可以只为其他操作创建新的自定义路由。您的 Controller 可能如下所示:

[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对应的路由。所以当有人向/MyItems/6 发送 DELETE 时,MVC 不会匹配前 3 条路由,但会匹配第 4 条。同样,如果有人向/MyItems/13 发送 PUT,MVC 将不会匹配前 2 个路由,但会匹配第 3 个。

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

关于c# - 没有 Action 的 ASP MVC 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10839896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com