操作路线可选ID参数

时间:2015-07-06 22:34:49

标签: c# asp.net asp.net-mvc routes

我尝试使用optional / id参数创建一个控制器操作,如下所示:

  1. 默认http://localhost/tasks
  2. 标识为http://localhost/tasks/42
  3. 这是控制器和动作: 我尝试做的是在动作

    上使用路线属性
    public class TasksController : AsyncController
    {
        [Route("tasks/{id}")]
        public ActionResult Index(string id)
        {
            ...
        }
    }
    

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

    任何想法如何使这项工作?

3 个答案:

答案 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" };
    }
}

我只是测试它,它工作正常