2010-05-03 31 views
5

tôi thiết lập một con đường tìm kiếm:ASP.NET MVC đường tìm kiếm

routes.MapRoute(
"Search", 
"Search/{q}", 
new { controller = "Search", action = "Index" } 
); 

Các hình thức tìm kiếm có một hộp nhập liệu và một nút. Tôi muốn tìm kiếm với GET như sau.

<% using(Html.BeginForm("Index", "Search", FormMethod.Get)) 
{%> 
    <%:Html.TextBox("q")%> 
     <span class="query-button"> 
     <input type="submit" value="select" /></span> 
    <% } %> 
</div> 

Hành động trên SearchController là:

public ActionResult Index(string q) 
{ 
    // search logic here 

    return View(new SearchResult(q)); 
} 

URL trở nên như thế này: http://localhost:19502/search?q=mvc+is+great

Nhưng tôi muốn tìm kiếm được như: http://localhost:19502/search/mvc+is+great

thế nào Tôi thiết lập tuyến đường hoặc Html.BeginForm

+0

thấy http://www.w3.org/TR/html401/interact/forms.html#h-17.13.1 –

Trả lời

5

Không có cách nào đơn giản để làm điều đó chỉ với một biểu mẫu. Chức năng dự định của một biểu mẫu là truyền các cặp tên/giá trị - bằng cách sử dụng MVC không thay đổi điều đó.

Vì vậy, lựa chọn của bạn là:

  • Override các chức năng của các hình thức sử dụng Javascript bằng cách xử lý trường hợp các hình thức gửi, chuyển hướng đến URL mong muốn và trả về false để ngăn chặn các hình thức từ thực nộp
  • Không sử dụng biểu mẫu và xử lý sự kiện nhấp của nút để thực hiện chuyển hướng.

Tuyến đường của bạn đã được thiết lập chính xác để xử lý việc này.

+0

Daniel đã đưa điều này khá độc đáo - bạn không thể ép buộc biểu mẫu tạo yêu cầu nhận và thay đổi URL cho bạn. – mare

+0

Triển khai sự kiện nhấp chuột js để chuyển hướng. Tôi đã sử dụng http://www.digitalbart.com/jquery-and-urlencode/ khá hay. – harropriiz

0

Hoặc bạn có thể làm FormMethod.Post và ngược lại RedirectToActionResult điều khiển của bạn

+0

Điều này yêu cầu thêm một chuyến đi vòng giữa máy chủ và ứng dụng khách để định dạng url. Không được khuyến khích. –

+0

Có, gọi thêm nhưng sử dụng js cũng không phải là cách hay. Và cũng không nên để người dùng trên cùng một trang nơi một số thay đổi dữ liệu được thực hiện (xóa, chỉnh sửa, thêm) vì vậy bằng cách nhấn f5, bạn sẽ được yêu cầu gửi dữ liệu một lần nữa. Và hãy xem - http://stackoverflow.com/questions/1936/how-to-redirecttoaction-in-asp-net-mvc-without-losing-request-data - mọi người đang sử dụng nó. –

Các vấn đề liên quan