2012-03-12 19 views
11

Tôi có một phương pháp hành động mà trông như thế này:ASP.NET MVC Di chuỗi truy vấn trong phương pháp hành động

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

gì xảy ra là url của yêu cầu này sẽ trông giống như:

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

Nhưng tôi muốn nó trông giống

www.mysite.com/controller/ 

có cách nào để loại bỏ các chuỗi truy vấn bên trong ActionMethod?

+0

bạn đang nói bạn muốn có thông báo mặc định khi họ không nhập chuỗi truy vấn? Hoặc bạn muốn ẩn chuỗi truy vấn bất kể loại thư được gửi trên url ban đầu? –

+0

Thứ hai, về cơ bản tôi muốn xử lý thông điệp (nó có thể là bất cứ điều gì) và không hiển thị nó trên url. – willvv

Trả lời

15

Không, trừ khi bạn sử dụng phương thức POST, thông tin phải được chuyển đi bằng cách nào đó. Một cách khác có thể là sử dụng một lớp ở giữa.

// 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(); 
} 

Hoặc. nếu bạn chỉ cần sử dụng 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

Đúng, chỉ là những gì tôi nghĩ. Tôi đã kết thúc làm một cái gì đó tương tự: \t \t \t \t nếu \t \t \t \t { \t \t \t \t \t TempData [ "Message"] = nhắn; (message = null!) \t \t \t \t \t return RedirectToAction ("Index"); \t \t \t \t} \t \t \t \t if (TempData.ContainsKey ("Message")) \t \t \t \t { \t \t \t \t \t ViewBag.Message = TempData [ "Message"]; \t \t \t \t \t TempData.Remove ("Message"); \t \t \t \t}, về cơ bản sẽ lưu thông báo và sau đó tải lại cùng một hành động mà không có thông số. – willvv

+0

Đây có phải là giải pháp tốt nhất không? Tôi có một trang chỉ hiển thị vào những giờ nhất định, và nó có một mô hình, nhưng hành động này là không thể truy cập công cộng và tôi muốn nó có một URL đẹp như/Đăng ký/AfterHours và không/Đăng ký/AfterHours? DateTime ... [ những ký tự điên rồ]. Bất kể, điều này không hoạt động. –

2

Tôi không chắc chắn bạn đang thực sự nghĩ rằng thông qua. Nếu bạn xóa chuỗi truy vấn ... thì bạn xóa chuỗi truy vấn .. nghĩa là trang của bạn sẽ không có giá trị chuỗi truy vấn để làm bất cứ điều gì cần làm.

Có một loạt các hack khác nhau mà bạn có thể làm .. tất cả chúng không lý tưởng. Bạn có thể sử dụng javascript để loại bỏ chuỗi truy vấn. Bạn có thể chuyển hướng đến trang truy vấn ít trang sau khi đặt biến phiên. Tất cả đều khá xấu.

Hãy nhớ rằng những gì người dùng nhìn thấy trong thanh địa chỉ trên máy khách. Khách hàng kiểm soát điều đó. Bạn có thể fiddle với nó thông qua javascript, nhưng làm như vậy thường là một ý tưởng tồi. Kể từ khi ẩn những thứ từ người dùng có thể được coi là hành vi giống như phần mềm độc hại.

1

Nhìn vào routes. Chúng xác định cách một url với các tham số sẽ được viết.

Nếu bạn tạo một ứng dụng MVC mới và xem tệp Global.asax.cs trong phần `RegisterRoutes(). bạn sẽ thấy một mục nhập.

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

Nhìn vào từng phần:

  • "mặc định" là tên. Điều này chỉ phải là duy nhất cho mỗi tuyến đường bạn tạo.
  • "{controller}/{action}/{id}" là mẫu bạn muốn sử dụng. example.org/home/index?id=2 sẽ được viết example.org/home/index/2 thay vì
  • mới {controller = "home", action = "index", id = UrlParameter.Optional} đang xác định mặc định nếu không có gì được chỉ định.

Vì vậy, con đường mà làm cho nó vì vậy nếu bạn đi đến example.org nó sẽ cho rằng bạn có nghĩa là example.org/home/index{id là tùy chọn}.

Làm việc từ đó, bạn có thể bắt đầu xem cách tạo tuyến đường của riêng mình.

Bây giờ, giải quyết câu hỏi của bạn câu trả lời ngắn là bạn có thể làm cho URL trông giống như vậy, nhưng không thực sự. Bạn sẽ phải xác định một tuyến đường với một thông báo mặc định, và nó sẽ chỉ trông như thế nếu ai đó không chỉ định một thông báo. Bạn phải nói cho bộ điều khiển biết thông điệp là gì. Tôi rất tiếc, nhưng điều tốt nhất bạn có thể làm là xác định tuyến đường cung cấp cho bạn

/message/Hello%20World và sử dụng chuỗi.thay thế khiến giao diện đẹp hơn ''/message/hello_world '

+0

Anh ấy không cố gắng thêm một tham số thân thiện, anh ấy muốn bằng cách nào đó có giá trị chuỗi truy vấn, nhưng không hiển thị nó ở tất cả trong url. –

+0

nếu bạn đọc toàn bộ câu trả lời của bạn, bạn sẽ thấy tôi giải quyết rằng – Joe

0

Tôi khuyên bạn nên sử dụng một con sên. Hãy xem bài đăng này: SOF Slug post Trong các ứng dụng trước, tôi đã thực hiện phương pháp này để xóa truy vấn khỏi URL.