【问题标题】:Action route optional id parameter动作路由可选id参数
【发布时间】:2015-09-24 05:57:16
【问题描述】:

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

  1. 默认http://localhost/tasks
  2. ID 为http://localhost/tasks/42

这是控制器和动作: 我试图做的是在动作上使用 route 属性

public class TasksController : AsyncController
{
    [Route("tasks/{id}")]
    public ActionResult Index(string id)
    {
        ...
    }
}

这有效,但仅适用于 url 中设置的 id 参数,但默认页面 /tasks 会引发未找到错误,或者当使用不带 id 的 [Route("tasks")] 时,默认页面有效,但是当设置了 id 时,再次抛出未找到的错误。我还尝试[Route("tasks/{id ?}")] 将 id 标记为可选参数,但没有成功。

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

【问题讨论】:

  • @JohnSaunders 但是在搜索与 asp.net 相关的问题时,大多数问题的标题中都有 ASP.NET MVC,这无疑更容易发现和查找。我没有看到问题。
  • 我不知道你是怎么搜索的。我刚刚搜索了stackoverflow.com/questions/tagged/…,事实并非如此。我强烈建议您检查我包含的链接。标签已包含此信息,因此您无需在标题中浪费空间,这样可以让人们更好地了解您的问题。
  • @JohnSaunders 我的意思是谷歌搜索,它更明显。我也检查了链接,我明白了。

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


【解决方案1】:

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

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

[Route("tasks/{id?}")]
public ActionResult Index(string id =null)

【讨论】:

  • 这似乎工作正常,我已经尝试过类似的东西,但我在 ? 之前有一个空格。在 ajax 调用此控制器自定义操作时,我的代码还有其他问题,似乎也调用了索引操作。但这可能与此无关吧?无论如何,我认为这是最好的答案
  • 很好的答案 (+1),但我遇到了这个问题:stackoverflow.com/questions/31256829/…
【解决方案2】:

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

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

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

【讨论】:

  • 我不认为这会有所帮助,我的代码中已经有这部分,但问题是路线
  • 这是如何被否决的?与接受的唯一区别是从一开始就将 id 设置为 null?
  • 我没有投反对票,所以我不知道,但正如我所说,这种方法的问题是路由 [Route("tasks/{id}")] 需要 ?作为可选参数
  • 如果你正确设置了你的路由配置,你可以将该参数设置为可选的,不管控制器 'routes.MapRoute( name: "Default", url: "{controller}/{action}/{id }",默认值:new { controller = "Home", action = "Index", id = UrlParameter.Optional } );'
  • Idk 如何编辑 cmets 但可选 id 值在路由配置中设置
【解决方案3】:
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" };
    }
}

我只是测试了一下,效果很好

【讨论】:

  • 哪一个你不明白? ContentResult?{id=demo}?{id?}?
  • ContentResult,我知道id?是可选参数,id=demo可能和if (id == "demo") {}..一样
猜你喜欢
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 2012-03-24
  • 2015-02-05
  • 1970-01-01
相关资源
最近更新 更多