【问题标题】:How to hide action and controller from url : asp.net mvc [duplicate]如何从 url 隐藏动作和控制器:asp.net mvc [重复]
【发布时间】:2016-11-11 18:25:51
【问题描述】:

简介

我正在开发用户可以注册的演示应用程序。用户表有“用户名”字段。“家庭”控制器中有“详细”操作接受字符串“用户名”的参数。

代码

public ActionResult Detail (string username)
{
 return View();
}

那么url就是

www.example.com/home/Detail?username=someparam

问题

我可以这样设置路线吗?

www.example.com/someparam

如果可能的话,请告诉我。任何帮助或参考将不胜感激。

感谢您的宝贵时间。

【问题讨论】:

  • 除非您创建一个路由约束,在每次发出任何请求时都查找数据库(这会导致性能不佳),否则您不能。
  • @StephenMuecke 感谢您的回复,我了解性能问题。我应该至少包含操作吗?
  • 是的,您可以创建一个路由定义,例如url: Detail/{username}",默认为HomeController 中的Detail() 方法(或者它可以是Users/{username} 或任何使其独一无二的东西)跨度>
  • @StephenMuecke 我添加了 rout 与 url: "{username}" 不可为空。有效。我们将需要检查用户是否存在,否则会重定向。你能建议它是错误的还是好的...谢谢
  • 如果你想这样做,那么你需要一个路由约束来检查参数是否是用户(通过查找用户存储库),如果它不是用户,则返回false 所以然后搜索下一条路线。

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-routing


【解决方案1】:

如果您更改路线的定义方式,这是可行的。假设您使用的是 dot net 4.5.2

查看 App_Start 下的 RouteConfig。

一个典型的路由定义是这样定义的:

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

没有什么可以改变路线看起来像这样:

routes.MapRoute(
name: "Default",
url: "{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }

);

我们基本上是将控制器和操作硬编码为某个值,所以现在您可以只使用 url/paramname 并且它将命中硬编码组合。

据说我不会做这样的事情,因为它违反了 MVC 的工作方式

MVC 路由是 url/controller/action。例如,您可以跳过诸如索引之类的通用内容的操作,并且您的 URL 变为 url/controller。 MVC 需要能够识别您想要点击哪个控制器以及哪个操作,并且最好保持在它的约定范围内。

另外,每个应用程序通常会有多个控制器,这样可以很好地分离关注点。现在您已经将自己硬编码为只有一个控制器和动作。

您的建议可以通过网络表单的方式更轻松地完成,所以也许您想研究一下。

【讨论】:

  • 是的,我已经实现了,感谢您的帮助,+1
【解决方案2】:

如果你这样定义代码

[HttpGet, Route("api/detail/{username:string}")]
public ActionResult Detail (string username)
{
 return View();
}

那么url就是

www.example.com/api/Detail/someparam

所以我客人你定义如下,请自行承担风险!

[HttpGet, Route("/{username:string}")]

网址将是:

www.example.com/someparam

【讨论】:

  • 感谢您的帮助,但它暗示 api,+1 努力
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
相关资源
最近更新 更多