MVC5基于属性的路由

时间:2014-10-15 01:51:04

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

所以这是我的代码:

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?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:-1)

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

我的Model类有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);
    }