gpt4 book ai didi

c# - AttributeRouting 修复两个名为 Id 的参数

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

所以我有一个项目使用默认的Route

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

我刚刚遇到了 7 年前在 MVC Pro Tip: Don't use the "id" URL parameter in your routes 描述的情况.

他们提供的解决方案非常棒,但此时此刻,我不想更改我的整个网站。我希望用 Attribute Routing 解决我的问题.

但是,我似乎无法让它工作,并且我收到一个 404 错误 页面。 (以防万一上面的链接不起作用,我将在此处详细描述代码)。

详情

在我的项目中,我使用了 ViewModelsViewModel(非常简单)定义为:

public class Foo {
public int Id { get; set; }
...
}

我的BarController如下:

public ActionResult Create(string id) {
if (string.IsNullOrWhiteSpace(id)) {
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
...
}

[HttpPost]
public ActionResult Create(string id, Foo viewModel) {
if (string.IsNullOrWhiteSpace(id)) {
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
...
}

错误

当我导航到 /Bar/Create/abc123 时,我看到我的表单很好。但是,当我提交表单时,Model.IsValidfalse。查看 this.ModelState 对象的 Watch 窗口,我发现要说的错误消息

The value 'abc123' is not valid for Id.'

我认为这是因为模型联编程序试图将 abc123 绑定(bind)到 ViewModel 上的 Id,它有一个 int 作为 Id 属性。

我尝试过的

到目前为止,这是我尝试在我的 Controller 上执行的操作:

[Route("Bar/Create/{aid}", Name = "FooBarRouteName")]
public ActionResult Create(string aid) {
if (string.IsNullOrWhiteSpace(aid)) {
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
...
}

[HttpPost]
public ActionResult Create(string aid, Foo viewModel) {
if (string.IsNullOrWhiteSpace(aid)) {
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
...
}

现在的问题是,当我导航到 /Bar/Create/abc123 时,我收到一个 404 错误 页面,甚至无法尝试提交表单。

有人可以指出我正确的方向或找出我做错了什么吗?谢谢!

最佳答案

首先确保在基于约定的路由之前启用属性路由,以避免路由冲突。

//Attribute routing
routes.MapMvcAttributeRoutes();

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

您在 POST 操作中缺少路由。

如果使用属性路由,你必须装饰 Controller 上的所有 Action

[HttpGet]
[Route("Bar/Create/{aid}", Name = "FooBarRouteName")] // GET Bar/Create/abc123
public ActionResult Create(string aid) {
if (string.IsNullOrWhiteSpace(aid)) {
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
...
}

[HttpPost]
[Route("Bar/Create/{aid}")] // POST Bar/Create/abc123
public ActionResult Create(string aid, Foo viewModel) {
if (string.IsNullOrWhiteSpace(aid)) {
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
...
}

关于c# - AttributeRouting 修复两个名为 Id 的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51434237/

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