操作路由可选id参数
本文关键字:id 参数 路由 操作 | 更新日期: 2023-09-27 18:01:28
我正在尝试创建一个带有可选/id参数的控制器操作,如:
- 默认
http://localhost/tasks
- 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标记为可选参数,但没有成功。
有什么办法让它发挥作用吗?
您可以通过在路由参数中添加问号来使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" };
}
}
我只是测试了一下,它工作得很好