ASP.NET MVC - Nhận giá trị Chuỗi truy vấn


76

Trong ASP.NET MVC, bạn có phải nhận các tham số QueryString giống như cách bạn làm trong ASP.NET WebForms? hoặc [AcceptVerbs(HttpVerbs.Get)]khai báo được sử dụng bằng cách nào đó?

Câu trả lời:


120

Tham số chuỗi truy vấn có thể được chấp nhận đơn giản bằng cách sử dụng một đối số trên hành động - tức là

public ActionResult Foo(string someValue, int someOtherValue) {...}

sẽ chấp nhận một truy vấn như .../someroute?someValue=abc&someOtherValue=123

Ngoài ra, bạn có thể xem trực tiếp yêu cầu để kiểm soát nhiều hơn.


Điều này sẽ ngăn chặn các cuộc tấn công chuỗi Truy vấn? giống như bất kỳ tiêm kịch bản?
Hamza Khanzada

"Someroute" trong trường hợp này là gì?
Igor Meszaros

32

Tôi nghĩ những gì bạn đang tìm kiếm là

Request.QueryString["QueryStringName"]

và bạn có thể truy cập nó trên các lượt xem bằng cách thêm @

bây giờ hãy xem ví dụ của tôi ,,, tôi đã tạo một Url bằng QueryString

 var listURL = '@Url.RouteUrl(new { controller = "Sector", action = "List" , name = Request.QueryString["name"]})';

giá trị listURL là /Sector/List?name=value'

và khi queryStringnào trống

giá trị listURL là /Sector/List


25

Bạn luôn có thể sử dụng Request.QueryStringbộ sưu tập như biểu mẫu Web, nhưng bạn cũng có thể làm cho MVC xử lý chúng và chuyển chúng dưới dạng tham số. Đây là cách được đề xuất vì nó dễ dàng hơn và nó sẽ tự động xác nhận kiểu dữ liệu đầu vào.


7

Tôi khuyên bạn nên sử dụng thuộc tính ValueProvider của bộ điều khiển, giống như cách UpdateModel / TryUpdateModel làm để trích xuất các thông số tuyến đường, truy vấn và biểu mẫu được yêu cầu. Điều này sẽ giữ cho chữ ký phương pháp của bạn không có khả năng phát triển rất lớn và có thể thay đổi thường xuyên. Nó cũng giúp kiểm tra dễ dàng hơn một chút vì bạn có thể cung cấp ValueProvider cho bộ điều khiển trong quá trình kiểm tra đơn vị.


1

Trên thực tế, bạn có thể nắm bắt các chuỗi Truy vấn trong MVC theo hai cách .....

public ActionResult CrazyMVC(string knownQuerystring)
{

  // This is the known query string captured by the Controller Action Method parameter above
  string myKnownQuerystring = knownQuerystring;

  // This is what I call the mysterious "unknown" query string
  // It is not known because the Controller isn't capturing it
  string myUnknownQuerystring = Request.QueryString["unknownQuerystring"];

  return Content(myKnownQuerystring + " - " + myUnknownQuerystring);

}

Điều này sẽ nắm bắt cả hai chuỗi truy vấn ... ví dụ:

/CrazyMVC?knownQuerystring=123&unknownQuerystring=456

Output: 123 - 456

Đừng hỏi tôi tại sao họ thiết kế nó theo cách đó. Sẽ có ý nghĩa hơn nếu họ ném ra toàn bộ hệ thống hành động Bộ điều khiển cho các chuỗi truy vấn riêng lẻ và chỉ trả lại danh sách động đã thu thập của tất cả các chuỗi / đối tượng tệp được mã hóa cho URL bằng mã hóa url-form-encoding để bạn có thể dễ dàng truy cập tất cả chúng trong một lệnh gọi . Có lẽ ai đó ở đây có thể chứng minh điều đó nếu có thể?

Đối với tôi không có ý nghĩa gì đối với cách Bộ điều khiển nắm bắt các chuỗi truy vấn, nhưng điều đó có nghĩa là bạn có thể linh hoạt hơn để nắm bắt các chuỗi truy vấn hơn là những gì họ dạy cho bạn. Vì vậy, hãy chọn thuốc độc của bạn .... cả hai đều hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.