我尝试使用optional / id参数创建一个控制器操作,如下所示:
http://localhost/tasks
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标记为可选参数,但它没有用。
任何想法如何使这项工作?
答案 0 :(得分:6)
您可以通过向路由参数添加问号来使URI参数可选。如果route参数是可选的,则必须为method参数定义默认值。
在操作方法上设置默认值,并在路径参数末尾添加问号。
[Route("tasks/{id?}")]
public ActionResult Index(string id =null)
答案 1 :(得分:0)
您必须检查控制器中参数的值:
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);
}
}
}
由于默认情况下字符串可以为空,因此您不必担心用户传递空值并获得黄色错误屏幕。
答案 2 :(得分:-1)
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" };
}
}
我只是测试它,它工作正常