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 种方法可以做到这一点:

  1. 使用 HTTP GET 在 URL 中传递它(作为路由值或查询字符串值)
  2. 使用 HTTP 在表单正文中传递它 POST
  3. 在模型中传递它(使用 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 设置按钮的样式,使其看起来像一个超链接。