Làm cách nào để lấy tham số chuỗi truy vấn từ đánh dấu MVC Razor?


81

Tôi muốn kiểm tra tham số URL trong đánh dấu Razor của mình. Ví dụ: làm cách nào để làm điều gì đó như sau:

<div id="wrap" class="@{if (URL "IFRAME" PARAMETER EQUALS 1) iframe-page}">

Câu trả lời:


118

Chủ đề tương tự

<div id="wrap" class=' @(ViewContext.RouteData.Values["iframe"] == 1 ? /*do sth*/ : /*do sth else*/')> </div>

EDIT 01-10-2014: Vì câu hỏi này rất phổ biến nên câu trả lời này đã được cải thiện.

Ví dụ trên sẽ chỉ nhận các giá trị từ RouteData, vì vậy chỉ từ các chuỗi truy vấn được bắt bởi một số tuyến đã đăng ký. Để nhận được giá trị chuỗi truy vấn, bạn phải truy cập hiện tại HttpRequest. Cách nhanh nhất là gọi (như TruMan đã chỉ ra) `` Request.Querystring 'nên câu trả lời sẽ là:

<div id="wrap" class=' @(Request.QueryString["iframe"] == 1 ? /*do sth*/ : /*do sth else*/')> </div>

Bạn cũng có thể kiểm tra RouteValues ​​so với QueryString MVC?

CHỈNH SỬA 03-05-2019: Giải pháp trên đang hoạt động cho .NET Framework.
Như những người khác đã chỉ ra nếu bạn muốn nhận giá trị chuỗi truy vấn trong .NET Core, bạn phải sử dụng Queryđối tượng từ Context.Requestđường dẫn. Vì vậy, nó sẽ là:

<div id="wrap" class=' @(Context.Request.Query["iframe"] == new StringValues("1") ? /*do sth*/ : /*do sth else*/')> </div>

Xin lưu ý rằng tôi đang sử dụng StringValues("1")trong câu lệnh vì Querytrả về StringValuesstruct thay vì pure string. Đó là cách làm sạch cho cảnh này mà tôi đã tìm thấy.


7
Cảm ơn vì những gợi ý. Điều này làm việc: <div id = class "bọc" = "@ (Request.QueryString "? "[" Iframe "] ==" 1 iframe": string.Empty)">
TruMan1

1
Tôi sẽ thêm bình luận của @ TruMan1 vào câu trả lời của bạn. Trong trường hợp của tôi, các giá trị không có trong dữ liệu tuyến đường (sử dụng nop-commerce) nhưng có thể truy cập được qua yêu cầu.
Ian

Để làm rõ - bạn muốn sử dụng Request.QueryString ví dụ nếu quan điểm đang được hiển thị như một hệ quả của một chuyển hướng
Chris Halcrow

Bạn có thể muốn thêm phần bắt đầu đó với .NET Core 2.1 mà bạn cần thay đổi ContextthànhHttpContext
Ivan García Topete

33

Nếu bạn đang sử dụng .net core 2.0, điều này sẽ là:

Context.Request.Query["id"]

Sử dụng mẫu:

<a href="@Url.Action("Query",new {parm1=Context.Request.Query["queryparm1"]})">GO</a>

3
Điều này cho biết 'Ngữ cảnh tên không tồn tại trong ngữ cảnh hiện tại'. Tuy nhiên, chỉ cần sử dụng Request.Query ["queryparm1"] hoạt động.
x5657

1
@ x5657 bạn nên đăng nhận xét của mình như một câu trả lời, vì đó là giải pháp duy nhất thực sự hiệu quả với tôi!
Jpsy

11

Chúng tôi đề xuất đăng câu trả lời này như một câu trả lời, vì một số câu trả lời khác đang mắc lỗi như 'Tên ngữ cảnh không tồn tại trong ngữ cảnh hiện tại'.

Chỉ cần sử dụng các hoạt động sau:

Request.Query["queryparm1"]

Sử dụng mẫu:

<a href="@Url.Action("Query",new {parm1=Request.Query["queryparm1"]})">GO</a>

2
Đó không làm việc cho tôi nhưng điều này đã làm: Request.QueryString
TroySteven

8

Không có câu trả lời nào phù hợp với tôi, tôi nhận được "'HttpRequestBase' không chứa định nghĩa cho 'Truy vấn'", nhưng điều này đã hoạt động:

HttpContext.Current.Request.QueryString["index"]

5

Tôi nghĩ một giải pháp thanh lịch hơn là sử dụng bộ điều khiển và từ điển ViewData:

//Controller:
public ActionResult Action(int IFRAME)
    {
        ViewData["IsIframe"] = IFRAME == 1;
        return View();
    }

//view
@{
    string classToUse = (bool)ViewData["IsIframe"] ? "iframe-page" : "";
   <div id="wrap" class='@classToUse'></div>
 }

3
Chế độ xem này được chia sẻ trên nhiều bộ điều khiển. Tôi nghĩ rằng điều này sẽ trở nên lộn xộn khi làm như thế này thay vì đưa logic trực tiếp vào đánh dấu Razor. Ngoài ra, tôi dự đoán tôi cũng có thể phải làm điều này trong các góc nhìn một phần.
TruMan1

Một giải pháp thanh lịch hơn là trả lại nó như là một phần của ViewModel return View(new SomeViewModel{ IsIFrame = IFrame });
Jose Capistrano

1

Đối với Asp.net Core 2

ViewContext.ModelState["id"].AttemptedValue

Tôi sẽ chỉ thêm điều đó mặc dù nó nói AttempValue- nếu tham số không tồn tại trong chuỗi truy vấn, bạn sẽ nhận được một ngoại lệ, vì vậy trước tiên bạn nên kiểm tra:@if (ViewContext.ModelState["id"] != null)...
adinas
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.