2012-03-12 64 views
11

我的操作方法是這樣的:ASP.NET MVC中刪除的操作方法查詢字符串

public ActionResult Index(string message) 
{ 
    if (message != null) 
    { 
    ViewBag.Message = message; 
    } 
    return View(); 
} 

什麼情況是,請求該網址看起來像:

www.mysite.com/controller/?message=Hello%20world 

但我希望它看起來只是

www.mysite.com/controller/ 

有沒有辦法去除actionmethod內的查詢字符串?

+0

你是說你想要一個默認消息,當他們不輸入查詢字符串?或者你想隱藏查詢字符串,而不管最初在URL上發送的消息類型如何? – 2012-03-12 18:55:52

+0

第二個,基本上我想處理消息(可以是任何東西),而不是顯示在網址上。 – willvv 2012-03-12 19:30:41

回答

15

不,除非使用POST方法,否則信息必須以某種方式傳遞。另一種可能是使用中間類。

// this would work if you went to controller/SetMessage?message=hello%20world 

public ActionResult SetMessage(string message) 
{ 
    ViewBag.Message = message ?? ""; 
    return RedirectToAction("Index"); 
} 

public ActionResult Index() 
{ 
    ViewBag.Message = TempData["message"] != null ? TempData["message"] : ""; 
    return View(); 
} 

或者。如果你只是使用POST

//your view: 
@using(Html.BeginForm()) 
{ 
    @Html.TextBox("message") 
    <input type="submit" value="submit" /> 
} 


[HttpGet] 
public ActionResult Index() 
{ return View(); } 

[HttpPost] 
public ActionResult Index(FormCollection form) 
{ 
    ViewBag.Message = form["message"]; 
    return View(); 
} 
+1

是的,正是我的想法。最後我做類似的事情:\t \t \t \t如果 \t \t \t \t { \t \t \t \t \t的TempData [ 「消息」] =消息(消息!= NULL) \t \t \t \t \t return RedirectToAction(「Index」); \t \t \t \t} \t \t \t \t如果(TempData.ContainsKey( 「消息」)) \t \t \t \t { \t \t \t \t \t ViewBag.Message = TempData的[ 「消息」]; \t \t \t \t \t TempData.Remove(「Message」); \t \t \t \t},它基本上保存消息,然後重新加載沒有參數的相同actionmethod。 – willvv 2012-03-12 19:28:04

+0

這仍然是最好的解決方案嗎?我有一個頁面只顯示在某些時間,它需要一個模型,但這個行動是不公開的,我希望它有一個像/註冊/ AfterHours和/註冊/ AfterHours漂亮的URL?DateTime ... [瘋狂的字符]。無論如何,這確實奏效。 – 2016-06-28 03:52:20

2

我不確定你是否真的在想這件事。如果你刪除了查詢字符串...那麼你刪除了查詢字符串..即,你的頁面將不會有查詢字符串值來做它需要做的事情。

有一堆你可以做的不同的黑客..所有這些都不理想。您可以使用JavaScript去除查詢字符串。設置會話變量後,您可以重定向到querystring-less頁面。這非常難看。

請記住,用戶在地址欄中看到的內容是在客戶端上。客戶端控制它。你可以通過JavaScript來擺弄它,但這樣做通常是一個糟糕的主意。由於隱藏用戶的東西可以被視爲類似惡意軟件的行爲。

1

調查routes。他們定義瞭如何寫一個帶參數的url。

如果您創建了一個新的MVC應用程序,並查看了RegisterRoutes()下的Global.asax.cs文件。你應該看到一個條目。

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 
    new { controller = "home", action = "index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

看看各部分:

  • 「默認」 這個名字。這對於您創建的每條路線都必須是唯一的。
  • 「{controller}/{action}/{id}」是您要使用的模式。 example.org/home/index?id=2將被寫入example.org/home/index/2而不是
  • 新{controller =「home」,action =「index」,id = UrlParameter.Optional}定義了默認值,如果沒有指定。

所以,這條路線讓它所以如果你去example.org它會假設你的意思example.org/home/index{id是可選}

從此開始工作,您可以開始瞭解如何創建自己的路線。

現在,解決你的問題簡單的答案是肯定的可以使URL看起來像,但沒有真正。你將不得不定義一條具有默認消息的路由,並且只有當某人沒有指定消息時纔會這樣。你必須告訴控制器信息是什麼。我很抱歉,但最好你可以做的是定義一條路線,讓你

/message/Hello%20World並使用字符串。替換使得看起來更好看`'/ message/hello_world'

+0

他沒有試圖添加一個友好的參數,他想要以某種方式有一個查詢字符串值,但不顯示它在URL中。 – 2012-03-12 18:48:44

+0

如果你讀了我的整個答案,你會看到我的地址 – Joe 2012-03-12 18:50:33

0

我推薦使用一個slu。。看看這篇文章:SOF Slug post 在以前的應用程序中,我採取了這種方法從URL中刪除querystrings。