【问题标题】:MVC5 Attribute based routingMVC5 基于属性的路由
【发布时间】:2014-10-15 01:51:04
【问题描述】:

这是我的代码:

Controller.cs

[Route("{controller}/{slug}")]
public ActionResult Details(int? id, string slug)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Tv tv = db.Tv.Find(id);
        if (tv == null)
        {
            return HttpNotFound();
        }
        return View(tv);
    }

{slug} 是一个标题。 但是我的网址显示

{controller}/{slug}?id=4

现在我必须将 ID 传递给控制器​​,这样我才能在数据库中找到记录,但我不希望它在 URL 中。

如何删除 ID?

【问题讨论】:

  • 如果你想在这个方法中访问id,它必须作为一个参数以某种方式进来。由于这可能是一个GET 方法,所以将它放在 URL 中是有意义的。您能否举例说明您希望 URL 的外观?也许您希望id 作为路径的一部分,如/Details/some-title/54
  • 所以/Details/54 将是原始路径。但是我希望 URL 看起来像 {controller}/{slug}。我需要控制器中的 Id,但不希望它在 URL 中

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


【解决方案1】:

所有获取参数都必须在 URL 中。唯一的另一种方法是将 ID 添加为标头,然后从标头集合中提取它。由客户端通过标头传递此值,您的 API 将 ID 作为标头变量强制执行。这是解决此问题的唯一方法,因为您必须以某种方式传递 ID。

或者,如果标题是唯一的,则使用它在控制器中查找 ID。

编辑:另一种选择,您可以使用 FORM POST 并将 ID 放入表单中。您可以设置一个按钮的样式,使其看起来像一个链接。

【讨论】:

  • 所以从我的索引页面我有一个像这样的链接@Html.ActionLink("Details", "Details", new { id=item.TvID, slug=item.TvTitle })
  • 我不相信你可以通过 actionlink
  • 我也尝试过使用 Titles 而不是 Id 来查找,但是它失败了。
  • 上面的另一种方法是转储链接,并使用表单。查看我的编辑。
  • 标题是否必须是 [Key] 才能找到它?
【解决方案2】:

好的,所以我相信我已经解决了这个问题,同时仍然保留 GET 方法而不是使用 POST。

我的模型类有 2 个键。通常您需要将两个密钥都传递给控制器​​,但是使用下面的代码允许我只发送一个密钥。这意味着我可以避免 ID 在 URL 中并且仍然将其作为模型中的密钥。

    [Route("TvShows/{slug}")]
    public ActionResult Details(string slug)
    {
        if (slug == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Tv tv = db.Tv.Where(x => x.TvTitle == slug).FirstOrDefault();
        if (tv == null)
        {
            return HttpNotFound();
        }
        return View(tv);
    }

【讨论】:

    猜你喜欢
    • 2016-05-23
    • 2016-01-12
    • 2016-09-04
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2023-04-10
    • 2016-01-06
    相关资源
    最近更新 更多