操作路由可选id参数

本文关键字:id 参数 路由 操作 | 更新日期: 2023-09-27 18:01:28

我正在尝试创建一个带有可选/id参数的控制器操作,如:

  1. 默认http://localhost/tasks
  2. id为http://localhost/tasks/42

以下是控制器和操作:我尝试在动作上使用路由属性

public class TasksController : AsyncController
{
    [Route("tasks/{id}")]
    public ActionResult Index(string id)
    {
        ...
    }
}

这是有效的,但仅在url中设置了id参数时有效,但默认页面/tasks会抛出一个未找到的错误,或者,当使用没有id的[Route("tasks")]时,默认页面有效,但当设置了id时,会再次抛出一个找不到的错误。我还尝试过[Route("tasks/{id ?}")]将id标记为可选参数,但没有成功。

有什么办法让它发挥作用吗?

操作路由可选id参数

您可以通过在路由参数中添加问号来使URI参数成为可选参数。如果路由参数是可选的,则必须为方法参数定义默认值。

设置操作方法的默认值,并在路线结束参数中添加问号。

[Route("tasks/{id?}")]
public ActionResult Index(string id =null)

您必须检查控制器中的参数值:

public class PlansController : AsyncController
{
    [Route("tasks/{id}")]
    public ActionResult Index(string id)
    {
        if(id == null)
        {
             return View("ViewName");
        }
        else
        {
             //Query DB and get model for the view
             return View("ViewName", Model);
        }
    }
}

由于字符串在默认情况下是可以为null的,所以您不必担心用户传递null并得到错误的黄色屏幕。

public class TestController : AsyncController
{
    [Route("tasks/{id?}")]
    public ActionResult Index(string id)
    {
        return new ContentResult() { Content = id ?? "Empty" };
    }
    [Route("task/{id=demo}")]
    public ActionResult Task(string id)
    {
        return new ContentResult() { Content = id ?? "DemoEmpty" };
    }
}

我只是测试了一下,它工作得很好