2016-05-23 325 views
0

我有兩種類型的功能用於一個bool變量的動作。ASP.NET MVC 5路由,隱藏URL中的數據

[HttpGet] 
public ActionResult action(bool data = false) 
{ 
    if(data == false) 
    { 
     return View("view1"); 
    } 
    else 
    { 
     return View("view2"); 
    } 
} 

這是一種[httpGet]方法。某些鏈接的數據布爾值爲true,部分鏈接的值爲false
該網址具有類似http://localhost:58241/action?data=False
的屬性我想隱藏URL中的?data=False?data=True,並且應該擁有與以前一樣的所有功能。

我要像事先http://localhost:58241/action

感謝URL。

回答

1

路由與查詢字符串參數完全沒有任何關係。在任何情況下,您仍然需要將data參數傳送到服務器,以便操作方法接收它。有3種方法來做到這一點:

  1. 通過它在URL中使用HTTP GET(作爲路由值或查詢字符串值)
  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)。它有兩個不同的表單標籤,根據點擊的按鈕,爲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看起來像一個剛樣式按鈕超鏈接。

0

bool data = false這會在缺失值時分配值。所以,當你調用的URL不data作爲參數,然後它會assing值作爲「假」

按你的要求,你需要做的是:

public ActionResult action(bool? data) //optional parameter 
{ 
    data = false; 
    if(data == false) 
    { 
     return View("view1"); 
    } 
    else 
    { 
     return View("view2"); 
    } 
} 

所以每次,return View("view1");將被稱爲不管你通過了什麼。

+0

我想通過更改路由的任何內容來隱藏數據屬性 – anand

+0

數據屬性將從每個鏈接傳遞。 – anand

+0

更新了答案。 –

0

您可以通過使@VishalSuthar建議的參數可選來部分實現此功能。但是,對於一種情況,如果您想使用GET請求訪問它,則必須使用該參數。

否則,如果您使Action只能通過POST請求訪問,則此部分將更容易實現。在這種情況下,只有改變你需要的是:

[HttpPost] 
public ActionResult action(bool data = false) 
{ 
    if(data == false) 
    { 
     return View("view1"); 
    } 
    else 
    { 
     return View("view2"); 
    } 
} 

這種方式可以傳遞參數的形式和擊中的網址顯示的操作:http://localhost:58241/action

注:這樣的操作將不能通過GET請求訪問。