路由與查詢字符串參數完全沒有任何關係。在任何情況下,您仍然需要將data
參數傳送到服務器,以便操作方法接收它。有3種方法來做到這一點:
- 通過它在URL中使用HTTP GET(作爲路由值或查詢字符串值)
- 使用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
)。它有兩個不同的表單標籤,根據點擊的按鈕,爲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看起來像一個剛樣式按鈕超鏈接。
我想通過更改路由的任何內容來隱藏數據屬性 – anand
數據屬性將從每個鏈接傳遞。 – anand
更新了答案。 –