【问题标题】:Asp.net MVC 5 make controller action to accept rest type parametersAsp.net MVC 5 使控制器动作接受休息类型参数
【发布时间】:2019-05-10 13:18:06
【问题描述】:

我有一个 ASP.NET MVC5 应用程序,并且我在其中一个控制器中编写了一个新的控制器操作。

我有一个场景,我想从不同的应用程序 (React) 调用这个新的控制器操作。

下面是我的新控制器动作。

public async Task<ActionResult> NewAction(int Id)
{
    var project = await _repository.GetProjectFromIdAsync(Id);
    if (project == null) return HttpNotFound();
    return RedirectToAction("ExistingAction", new { id = project.Id });
}

我可以使用这个 url 成功调用操作 - https://myapplicationlink/ControllerName/NewAction?Id=30

但我想用休息类型的 url 来调用动作,比如 https://myapplicationlink/ControllerName/NewAction/30

但是当我这样做时,我得到了一个错误

参数字典包含方法“System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult] NewAction(Int32) 的不可空类型“System.Int32”的参数“Id”的空条目'

如何使动作接受休息类型的 URL?

【问题讨论】:

  • 检查基于约定或属性的路由模板以确保它与所需的格式匹配
  • 看起来不错。没有属性路由和使用url配置的常规路由:“{controller}/{action}/{id}”。而且我还可以使用 rest 类型的 url 调用同一控制器的其他操作。
  • 路由模板占位符中的参数名称区分大小写。您有Id (大写I),而模板为id (小写)。重命名参数以匹配路由模板Task&lt;ActionResult&gt; NewAction(int id) { ....

标签: c# asp.net .net asp.net-mvc asp.net-mvc-routing


【解决方案1】:

路由模板占位符中的参数名称区分大小写。

你有Id(大写I),而模板为id(小写)

这与{controller}/{action}/{id} 路由模板不匹配

重命名参数以匹配路由模板Task&lt;ActionResult&gt; NewAction(int id) { ....

public async Task<ActionResult> NewAction(int id) {
    var project = await _repository.GetProjectFromIdAsync(id);
    if (project == null) return HttpNotFound();
    return RedirectToAction("ExistingAction", new { id = project.Id });
}

【讨论】:

  • 虽然这解决了我的问题。我想要一个特定的名称,而不是像 externalId 这样的 id。因为这里涉及到两个id。这对于正在阅读此代码的其他开发人员来说是很清楚的。因此,我在此操作中额外添加了一个属性路由,例如 [Route("Controller/NewAction/{externalId:int}")]。这也很有效。
【解决方案2】:

首先,检查你是否配置了路由{controller}/{action}/{id}

然后将Id参数名称重命名为id

【讨论】:

    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    相关资源
    最近更新 更多