【发布时间】:2018-12-28 06:36:57
【问题描述】:
所以我有一个项目使用默认的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 Error 页面。 (以防上面的链接失效,我会在这里详细描述代码)。
详情
在我的项目中,我使用ViewModels。 ViewModel(非常简单)定义为:
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.IsValid 是false。查看Watch 窗口的this.ModelState 对象,我发现错误消息要说
值 'abc123' 对 Id 无效。'
我认为这是因为模型绑定器试图将 abc123 绑定到 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 Error 页面,甚至无法尝试提交表单。
谁能指出我正确的方向或找出我做错了什么?谢谢!
【问题讨论】:
-
您能否考虑重命名
Foo中的id属性? -
我是,但如果我做不到,我想知道如何完成这项工作。 =) 我喜欢学习如何解决这些问题,而不仅仅是“创可贴”
-
您在 POST 操作中缺少一条路线。如果使用属性路由,则必须装饰所有操作
-
@Nkosi 谢谢。如果我最终走这条路线,我也会在那里添加它。
标签: c# asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing attributerouting