动作路由可选的 id 参数
Action route optional id parameter
我正在尝试使用可选的 /id 参数创建控制器操作,如下所示:
- 默认
http://localhost/tasks
- 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" };
}
}
我刚刚测试了一下,没问题
我正在尝试使用可选的 /id 参数创建控制器操作,如下所示:
- 默认
http://localhost/tasks
- 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" };
}
}
我刚刚测试了一下,没问题