2011-07-28 47 views
0

我想用BegingForm與Get方法,這是我做的查詢字符串從BeginForm在MVC 3

@using (Html.BeginForm("Search","Home",FormMethod.Get)) 
{ 
    //My input elements 

} 

public class HomeController : Controller 
{ 
    public ActionResult Search(string queryString) 
    { 
    } 

} 

但查詢字符串總是回來爲空。我想,我需要做一些事情的路線,但沒有運氣

routes.MapRoute(
      "SearchRoute", // Route name 
      "Home/Search{queryString}", // URL with parameters 
      new { controller = "Home", action = "Search", filter = UrlParameter.Optional } // Parameter defaults 
      ); 

顯然,即將到來的URL到服務器是一樣的東西

主頁/搜索?查詢=「嗒嗒」 & QUERY2 =「嗒嗒」 & query3 =「blah」

我在做什麼錯?當我想用beginform使用get時,在控制器中獲取查詢參數的正確方法是什麼?

此外,如果我的BeginForm的內容可以更改,並且查詢字符串參數名稱可能因呈現的頁面而異,但我希望有一個Search方法可以分析查詢字符串並執行正確的操作?

此外,是他們的方式來查詢參數來進入一個字典?

回答

1

顯然,即將到來的URL到服務器是一樣的東西 主頁/搜索?查詢= 「嗒嗒」 & QUERY2 = 「嗒嗒」 & QUERY3 = 「嗒嗒」

那怎麼HTML <form>與方法GET的工作,這與ASP.NET MVC無關,它是純HTML。你不能做這種事,不是有你的控制器動作等是這樣的:

public ActionResult Search(SearchViewModel model) 
{ 
    ... 
} 

SearchViewModel將包含此表單上的每個輸入字段屬性。你也不需要這SearchRoute,因爲它不會那樣工作。

這就是說,你可能可以使用JavaScript來訂閱表格的onsubmit事件,取消默認提交(顯示當前觀察的行爲),手動獲取表單中的所有值,然後手動使用window.location.href = '....';生成你想要的網址並重定向到它。我只是爲了完整性而提及這一點,但絕對不是我推薦的或你應該做的事情。

+0

你是說mvc框架可以自動將我的查詢字符串反序列化爲SearchViewModel嗎?我是否需要裝飾SearchViewModel來實現這一點?你能否請我介紹一下如何將查詢字符串映射到SearchViewModel的文檔? – iCode

+0

@Mike Dotnet,是的,這就是默認的模型綁定器所做的。你不必裝飾任何東西。您只需確保此模型中的屬性名稱與您的HTML'

'中的輸入字段的名稱相對應。但是,當然,如果您使用強類型助手(如「Html.TextBoxFor」)並傳遞一個lambda表達式來生成這些輸入字段,框架將負責正確命名它們,以便您不必擔心它。 –

0

如果你想從查詢字符串中的項目,只需使用從ControllerBase「請求」對象:

public ActionResult Search() 
    { 
     var queries = new List<string>(); 
     foreach (var parameter in Request.QueryString) 
     { 
      queries.Add(parameter.ToString()); 
     } 
     //Do Stuff with the query parameters... 
     return View("Index"); 
    } 

和「的Request.QueryString」就如你想:)

字典
+0

太棒了!這也很有用。 – iCode