我的控制器中有以下路线。一个Get和两个post动作。所有人都有相同的行动名称。使用MultipleButton属性区分两个后置操作,如here所述:
[RoutePrefix("incidents")]
public sealed class IncidentsController : Controller
{
[HttpGet, Route("action/{id:int?}/{error?}")]
public async Task<ActionResult> Action(int? id, string error = null)
[HttpPost, Route("action"), ActionName("Action"), ValidateAntiForgeryToken]
[MultipleButton(Name = "action", Argument = "Accept")]
public async Task<ActionResult> ActionAccept(IncidentActionViewModel incident)
[HttpPost, Route("action"), ActionName("Action"), ValidateAntiForgeryToken]
[MultipleButton(Name = "action", Argument = "Reject")]
public async Task<ActionResult> ActionReject(IncidentActionViewModel incident)
}
@Url.Action("Action", "Incidents", new { id = 10 })
上面的路线呈现如下所示。导航到此网址有效,但如果我更改了&#39; id&#39;参数从Nullable到int我开始得到错误。
/事件/动作?ID = 10
它应该呈现如下所示,如果我更改了&#39; id&#39;我不应该出错。输入int的参数:
/事件/动作/ 10
我做错了什么?
更新
以下是我的路线注册详情:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });
答案 0 :(得分:0)
作为解决方法,我发现我可以使用命名路由而不是依赖ASP.NET MVC来使用控制器和操作名称来解析路由。所以我最终得到了以下代码:
[RoutePrefix("incidents")]
public sealed class IncidentsController : Controller
{
[HttpGet, Route("action/{id:int?}/{error?}", Name = "IncidentsGetAction")]
public async Task<ActionResult> Action(int? id, string error = null)
[HttpPost, Route("action", Name = "IncidentsPostActionAccept"), ActionName("Action"), ValidateAntiForgeryToken]
[MultipleButton(Name = "action", Argument = "Accept")]
public async Task<ActionResult> ActionAccept(IncidentActionViewModel incident)
[HttpPost, Route("action", Name = "IncidentsPostActionReject"), ActionName("Action"), ValidateAntiForgeryToken]
[MultipleButton(Name = "action", Argument = "Reject")]
public async Task<ActionResult> ActionReject(IncidentActionViewModel incident)
}
// Generate a URL
@Url.RouteUrl("IncidentsGetAction", new { id = 10 })
// Generate a link to a URL
@Html.RouteLink("Link Text", "IncidentsGetAction", new { id = 10 })
这种方法具有更好的性能,因为MVC不必解析URL,它可以直接转到它。当您明确了解要使用的路线时,它也更容易理解并减少出现错误的可能性。
我个人已将所有路由转换为命名路由,并已放弃使用控制器和操作已解决的路由。看到为什么会出现上述问题仍然很有趣。