Asp.net mvc ASP.NET MVC 5路由,在URL中隐藏数据

Asp.net mvc ASP.NET MVC 5路由,在URL中隐藏数据,asp.net-mvc,routes,url-routing,asp.net-mvc-routing,Asp.net Mvc,Routes,Url Routing,Asp.net Mvc Routing,对于带有bool变量的操作,我有两种类型的功能 [HttpGet] public ActionResult action(bool data = false) { if(data == false) { return View("view1"); } else { return View("view2"); } } 这是一种[httpGet]方法。有些链接的数据布尔值为true,有些链接的数据布尔值为false url的属性类似于ht

对于带有
bool
变量的操作,我有两种类型的功能

[HttpGet]
public ActionResult action(bool data = false)
{
   if(data == false)
   {
      return View("view1");
   }
   else
   {
      return View("view2");
   }
}
这是一种
[httpGet]
方法。有些链接的数据布尔值为
true
,有些链接的数据布尔值为
false

url的属性类似于
http://localhost:58241/action?data=False

我想从URL中隐藏
?data=False
?data=True
,并且应该像以前一样拥有所有相同的功能

我想要像
http://localhost:58241/action


提前感谢。

您可以按照@VishalSuthar的建议将参数设置为可选参数,从而部分实现此功能。但对于一个条件,如果要使用GET请求访问该参数,则必须使用该参数

否则,如果将
操作设置为只能通过POST请求访问,则此部分将更容易实现。在这种情况下,您需要的唯一更改是:

[HttpPost]
public ActionResult action(bool data = false)
{
   if(data == false)
   {
      return View("view1");
   }
   else
   {
      return View("view2");
   }
}
通过这种方式,您可以在表单中传递参数并点击操作,URL显示:


注意:这样,操作将无法通过GET请求访问。

路由与查询字符串参数完全无关。在任何情况下,您仍然需要将
数据
参数传输到服务器,以便操作方法接收它。有三种方法可以做到这一点:

  • 使用HTTP GET(作为路由值或查询字符串值)将其传递到URL中
  • 使用HTTPPOST在表单体中传递它
  • 在模型中传递它(使用HTTP POST和模型绑定)
  • 最简单的选项是#1,但是由于您提到通过URL传递数据是不可接受的,因此您唯一的选择是使用HTTPPOST。因此,这个答案的其余部分使用#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方法返回的视图(名为
    Action.cshtml
    )。它有两个不同的表单标记,根据单击的按钮为
    数据提交不同的值

    @{
        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" />
    }
    
    @{
    ViewBag.Title=“操作”;
    }
    选择一个选项
    @使用(Html.BeginForm(“操作”、“数据”)){
    }
    @使用(Html.BeginForm(“操作”、“数据”)){
    }
    
    请注意,如果您愿意,您可以完全使用JavaScript(AJAX POST)完成此步骤,这将使您能够使用超链接而不是按钮,或者您可以使用CSS将按钮样式设置为超链接