2012-11-05 58 views
1

我有一個應用程序顯示地圖上的位置。我創建了一個路線,以便我可以擁有漂亮的可破解URL,例如http://www.mydomain.com/paris。這隻需輸入URL即可正常工作,但在發送GET請求的主頁上有一個搜索表單。提交表單時,地址欄中顯示的URL格式爲http://www.mydomain.com/Dashboard?location=paris。通常這不會有太大的問題,因爲它正在執行正確的操作,但是我有一個運行該節目的backbone.js應用程序,它特別針對URL結構。在MVC3中,如何創建像mydomain.com/chigago這樣的路線並從GET表單中創建路線?

如果沒有javascript或重定向,我可能無法做到我需要的東西,因爲當表單ACTION屬性被填充時,位置是未知的 - 但任何人都可以確認嗎?

這是我的路線。

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
    routes.MapRoute(
     String.Empty, 
     "{location}", 
     new { 
      controller = "Dashboard", 
      action = "Index", 
      id = "" 
     } 
    ); 

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

} 

這裏是控制器。

public class DashboardController : Controller 
{ 
    [HttpGet] 
    public ViewResult Index(string location) 
    { 
     return View(new AccItemSearch { Location = location }); 
    } 
} 

這裏是表格。

 @using (Html.BeginForm("Index", "Dashboard", FormMethod.Get)) { 
       <h2>Where are you going?</h2> 
       <input type="text" placeholder="Area, town or postcode" id="location" name="location"/> 
       <button>Search!</button> 
      </div> 
     } 

爲了澄清:我想獲得幫助的問題是如何讓用戶提交表單,然後降落的URL的網頁上:http://www.mydomain.com/searchterm,從而匹配的路由,而不是在頁面上與網址http://www.mydomain.com/Dashboard

回答

0

在HTML生成期間(即服務器端),您將無法更改表格的action屬性,因爲您根本不知道該指向什麼。因此,如果您需要網址最終成爲確切的搜索字詞,最簡單的賭注可能是在提交表單之前使用JavaScript將action屬性更改爲該屬性,並且擁有一個控制器,用於捕獲www.domain.com後面的所有網址/ searchterm模式。

你不能真的重定向到一個特定的動作,因爲那樣會成爲返回到瀏覽器的URL,我懷疑你想要每個搜索項一個動作。

HTML:

<form method="post" id="myform"> 
    <input type="text" id="searchterm" /> 
    <input type="submit" value="Search" /> 
</form> 

的jQuery:

$(function() { 
    $("#myform").submit(function() { 
     var searchVal = $("#searchterm").val(); 
     $(this).attr("action", searchVal); 
    }); 
}); 

路線:

routes.MapRoute(
    "", 
    "{searchterm}", 
    new { controller = "Home", action = "Search" } 
); 

注意,這必須把之前的默認路由。

操作:

public ActionResult Search(string searchterm) 
{ 
    //do stuff 
} 

現在,如果有客人來訪的術語「阿拉斯加」,並提交搜索表單,他們將結束在domain.com/Alaska。

+1

謝謝。我打算採用這種方法而不是重定向,因爲它應該總體上更快(就http請求數而言)。我腦海中的聲音總是在講「如果JavaScript被禁用,怎麼辦」,但我可能會在那裏展示我的年齡。無論如何,因爲我已經在使用骨幹,所以我承諾! – centralscru

+0

我知道關於JS的感覺......但是當JS被禁用時,嘗試訪問任何主要公司的頁面。它通常看起來像廢話,並不會運作良好。禁用JS並希望獲得良好的瀏覽器體驗,今天不會浮動。 –

0

該表單應該是提交表單數據的POST。

搜索應該是一個提交按鈕

<input type="submit" name="Search" value="Search" /> 

否則,它看起來不錯,除非你有一個衝突的途徑。單獨測試你的路線,看起來很好。這只是該位置沒有被髮送。

+0

嗯,我使用GET故意傳輸查詢字符串上的數據。使用POST獲取數據到動作中,但位置欄中的URL顯示「http://www.mydomain.com/Dashboard」,這不是我想要的。 – centralscru

+0

讓它更新網址,然後在帖子中重定向到預期路線。這個帖子有一個特定的網址,例如SearchWith(字符串位置),然後在這個RedirectToAction(「Index」,new {location});基本上帖子重定向獲取模式。 – dove