ASP.NET MVC 5 路由,隐藏数据 URL
ASP.NET MVC 5 routing, hide data in URL
对于带有 bool
变量的操作,我有两种功能。
[HttpGet]
public ActionResult action(bool data = false)
{
if(data == false)
{
return View("view1");
}
else
{
return View("view2");
}
}
这是一个[httpGet]
方法。一些 link 的数据 bool 值为 true
而一些 false
.
url 具有类似 http://localhost:58241/action?data=False
的属性
我想从 URL 中隐藏 ?data=False
或 ?data=True
,并且应该拥有与以前相同的所有功能。
我想要 URL 喜欢 http://localhost:58241/action
提前致谢。
您可以按照@VishalSuthar 的建议将参数设为可选,从而部分实现此功能。但是对于一种情况,如果您想使用 GET 请求访问它,则必须使用该参数。
否则,如果您使 Action
只能由 POST 请求访问,这部分将更容易实现。在那种情况下,您只需要更改:
[HttpPost]
public ActionResult action(bool data = false)
{
if(data == false)
{
return View("view1");
}
else
{
return View("view2");
}
}
这样你就可以在表单中传递参数并点击动作 URL 显示:http://localhost:58241/action
注意:这样操作将无法通过 GET 请求访问。
路由与查询字符串参数完全无关。并且无论如何,您仍然需要将 data
参数传递给服务器,以便操作方法接收它。有 3 种方法可以做到这一点:
- 使用 HTTP GET 在 URL 中传递它(作为路由值或查询字符串值)
- 使用 HTTP 在表单正文中传递它 POST
- 在模型中传递它(使用 HTTP POST 和模型绑定)
最简单的选择是 #1,但是由于您提到通过 URL 传递数据是不可接受的,您唯一的选择是使用 HTTP post。所以,这个答案的其余部分使用#2.
首先,默认路由不覆盖您选择的URL(/action
),因此您需要为此插入一个自定义路由。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Add route to handle /action
routes.MapRoute(
name: "Action",
url: "action",
defaults: new { controller = "Data", action = "Action" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
接下来,您需要一个控制器来处理来自浏览器的 GET 和 POST。
public class DataController : Controller
{
public ActionResult Action()
{
return View();
}
[HttpPost]
public ActionResult Action(bool data = false)
{
if (data)
{
return View("view2");
}
return View("view1");
}
}
数据在POST中传回服务器,所以不需要在URL中传递。
最后,您获得了从 Action
操作方法返回的视图(名为 Action.cshtml
)。它有 2 个不同的表单标签,根据单击的按钮为 data
提交不同的值。
@{
ViewBag.Title = "Action";
}
<h2>Choose an Option</h2>
@using (Html.BeginForm("action", "Data")) {
<input type="hidden" name="data" value="true" />
<input type="submit" value="With Data" />
}
@using (Html.BeginForm("action", "Data")) {
<input type="hidden" name="data" value="false" />
<input type="submit" value="Without Data" />
}
请注意,如果愿意,您可以完全在 JavaScript (AJAX POST) 中执行此步骤,这将使您能够使用超链接而不是按钮,或者您可以只需使用 CSS 设置按钮的样式,使其看起来像一个超链接。
对于带有 bool
变量的操作,我有两种功能。
[HttpGet]
public ActionResult action(bool data = false)
{
if(data == false)
{
return View("view1");
}
else
{
return View("view2");
}
}
这是一个[httpGet]
方法。一些 link 的数据 bool 值为 true
而一些 false
.
url 具有类似 http://localhost:58241/action?data=False
的属性
我想从 URL 中隐藏 ?data=False
或 ?data=True
,并且应该拥有与以前相同的所有功能。
我想要 URL 喜欢 http://localhost:58241/action
提前致谢。
您可以按照@VishalSuthar 的建议将参数设为可选,从而部分实现此功能。但是对于一种情况,如果您想使用 GET 请求访问它,则必须使用该参数。
否则,如果您使 Action
只能由 POST 请求访问,这部分将更容易实现。在那种情况下,您只需要更改:
[HttpPost]
public ActionResult action(bool data = false)
{
if(data == false)
{
return View("view1");
}
else
{
return View("view2");
}
}
这样你就可以在表单中传递参数并点击动作 URL 显示:http://localhost:58241/action
注意:这样操作将无法通过 GET 请求访问。
路由与查询字符串参数完全无关。并且无论如何,您仍然需要将 data
参数传递给服务器,以便操作方法接收它。有 3 种方法可以做到这一点:
- 使用 HTTP GET 在 URL 中传递它(作为路由值或查询字符串值)
- 使用 HTTP 在表单正文中传递它 POST
- 在模型中传递它(使用 HTTP POST 和模型绑定)
最简单的选择是 #1,但是由于您提到通过 URL 传递数据是不可接受的,您唯一的选择是使用 HTTP post。所以,这个答案的其余部分使用#2.
首先,默认路由不覆盖您选择的URL(/action
),因此您需要为此插入一个自定义路由。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Add route to handle /action
routes.MapRoute(
name: "Action",
url: "action",
defaults: new { controller = "Data", action = "Action" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
接下来,您需要一个控制器来处理来自浏览器的 GET 和 POST。
public class DataController : Controller
{
public ActionResult Action()
{
return View();
}
[HttpPost]
public ActionResult Action(bool data = false)
{
if (data)
{
return View("view2");
}
return View("view1");
}
}
数据在POST中传回服务器,所以不需要在URL中传递。
最后,您获得了从 Action
操作方法返回的视图(名为 Action.cshtml
)。它有 2 个不同的表单标签,根据单击的按钮为 data
提交不同的值。
@{
ViewBag.Title = "Action";
}
<h2>Choose an Option</h2>
@using (Html.BeginForm("action", "Data")) {
<input type="hidden" name="data" value="true" />
<input type="submit" value="With Data" />
}
@using (Html.BeginForm("action", "Data")) {
<input type="hidden" name="data" value="false" />
<input type="submit" value="Without Data" />
}
请注意,如果愿意,您可以完全在 JavaScript (AJAX POST) 中执行此步骤,这将使您能够使用超链接而不是按钮,或者您可以只需使用 CSS 设置按钮的样式,使其看起来像一个超链接。