动作路由可选的 id 参数

Action route optional id parameter

我正在尝试使用可选的 /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 会抛出一个未找到的错误,或者当使用 [Route("tasks")] 而不使用 id 时,默认页面有效,但设置 id 后,将再次抛出未找到错误。我还尝试 [Route("tasks/{id ?}")] 将 id 标记为可选参数,但它没有用。

有什么想法可以实现吗?

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

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);
        }
    }
}

由于默认情况下字符串可以为空,因此您不必担心用户传递空值并出现黄屏错误。

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

在动作方法上设置默认值并在路由参数末尾添加问号。

[Route("tasks/{id?}")]
public ActionResult Index(string id =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" };
    }
}

我刚刚测试了一下,没问题