如何使用asp.net MVC4在URL中隐藏ID

如何使用asp.net MVC4在URL中隐藏ID,asp.net,asp.net-mvc-4,Asp.net,Asp.net Mvc 4,我的网址 {Alias}-{ID} 我的路线呢 routes.MapRoute( name: "ProductDetail", url: "Products/{Alias}-{detailId}", defaults: new { controller = "Products", action = "ProductDetail", id = UrlParameter.Optional }

我的网址

{Alias}-{ID}

我的路线呢

routes.MapRoute(
               name: "ProductDetail",
               url: "Products/{Alias}-{detailId}",
               defaults: new { controller = "Products", action = "ProductDetail", id = UrlParameter.Optional }
            );
内部控制器

public ActionResult ProductDetail(int? detailId)
        {
            var pro = db.Products.Find(detailId);
            if (pro == null)
            {
                return RedirectToAction("Index", "NotFound");
            }
            return View(pro);
        }
现在,我想在我的URL中隐藏ID,就像

{Alias}


我该怎么做

简短回答

做你想做的事是不可能的。在这种情况下,如果您希望能够从控制器访问
detailId
,则必须将
detailId
作为URL的一部分传递-您无法访问不存在的内容


长答案

还有其他方法可以绕过对用户“隐藏”detailId的问题,下面是一些建议:

1。改用别名:

您可以同时删除
detailId
并使用
别名
值。但是,这将要求
别名
值对于您试图查询的产品是唯一的,并且所需的更改可能如下所示:

routes.MapRoute(
    //..
    url: "Products/{Alias}",
    //..
);

public ActionResult ProductDetail(string Alias)
{
    var pro = db.Products.FindByAlias(Alias);
    //...
}
http://www.domain.com/Products/{Alias}-MQ%3D%3D
2。使用POST请求:

另一种解决方案将有效地从URL隐藏
detailId
,但仍然允许将值传递给控制器,即使用POST请求,其中参数值将在POST请求正文中指定

然而,这样做的缺点是,你不能简单地提供一个供用户点击的URL,在你的站点中编码链接需要花费相当多的精力。通常在MVC中,提交表单时会发出POST请求,您也可以使用javascript ajax调用执行POST请求

这在这个答案中有点太多,所以如果你有兴趣,那么做一些研究,比如,或者一些一般性的研究

3。加密detailId值:

现在,此选项不会从URL中隐藏
detailId
,但是如果您担心当前ID过于用户友好,那么您可以“加密”(松散地使用)该值。例如,您可以将其转换为base64字符串,然后在控制器中转换回int。这将为您提供类似以下内容的URL:

routes.MapRoute(
    //..
    url: "Products/{Alias}",
    //..
);

public ActionResult ProductDetail(string Alias)
{
    var pro = db.Products.FindByAlias(Alias);
    //...
}
http://www.domain.com/Products/{Alias}-MQ%3D%3D
此URL将
1
表示为
detailId
,如果使用此方法,必须确保您的值

在这种情况下,Base64转换并不是真正的“加密”,任何半精明的用户都会注意到这一点,并可以绕过它。但是,如果您想采用这种方法,也可以使用更安全的双向加密算法,即只有服务器知道加密/解密密钥的方法。这里的缺点是,只有服务器才能生成有效的URL供用户“单击”


在这一点上,值得考虑的是,如果您担心URL包含一个简单的数字ID,对用户过于友好,那么问题是:为什么您会在意

如果您担心用户只需更改
detailId
值,然后就可以访问他们应该访问的产品,那么您的安全问题就更大了。如果是这种情况,那么您的控制器应该负责验证用户是否有权访问他们试图访问的产品,然后采取相应的行动


所有的安全检查和验证都应该在服务器端进行,永远不要依赖您的客户端代码或用户操作来完成

你什么意思把它藏起来?如果不将其添加到url,则无法在控制器中获取它。如果
别名
对于产品是唯一的,则您可以完全删除该id并使用它,但前提是您确定它是唯一的。如果你解释一下为什么你想隐藏它,也许会有帮助,因为可能有其他方法可以得到你想要的achieve@StephenMuecke如果我没有在URL中添加detailID,那么如何在controller中获取detailID?@musefan,OP需要在方法中添加一个参数,因为它在路由中完全没有用处,你不能(除非您的过帐表单数据)。另外,
id=UrlParameter。可选的
有点毫无意义-您没有名为
id
的参数。您也没有
{alias}
的参数