2010-08-23 37 views
5

Khi tôi cố gắng cơ cấu như sau, nó does't gửi id=valueBiểu mẫu HTML: tại sao hành động không thể có được giá trị trong đó?

<form action="some.php?id=value" method="get"> 
    <input name="name1" value="value1"> 
    <input type="submit"> 
</form> 

Tôi biết rằng tôi có thể gửi id=value trong lĩnh vực ẩn, nhưng thật thú vị, tại sao nó không cho phép cấu trúc như vậy?

+0

Ý bạn là gì bởi "không gửi"? URL này gửi biểu mẫu tới là gì? – roryf

+0

sau khi gửi nó sẽ được chuyển hướng đến 'some.php? Name1 = value1', nó mất'? Id = value' – Simon

Trả lời

5

Đó là vì phần "method = get" của biểu mẫu ngụ ý rằng các giá trị truy vấn phải đến từ các giá trị biểu mẫu.

Bộ sưu tập chứa "id = value" bị bộ sưu tập chứa các giá trị biểu mẫu ghi đè.

Hành vi này dường như được tích hợp vào mỗi trình duyệt, vì vậy tôi hy vọng rằng đó là một phần của đặc tả HTML.

Cập nhật

Ahah:

này đã được hỏi trước: submitting a GET form with query string params and hidden params disappear

Để Trích dẫn:

Như thông số kỹ thuật (RFC1866, trang 46; phần 4.x HTML 17.13.3) trạng thái:

Nếu phương thức là "nhận" và hành động là một URI HTTP, tác nhân người dùng nhận giá trị của hành động, gắn thêm một `? ' với nó, sau đó nối thêm tập dữ liệu biểu mẫu, được mã hóa bằng loại nội dung "application/x-www-form-urlencoded".

1

Nếu phương thức biểu mẫu của bạn là POST, thì bạn sẽ không thấy id như một phần của giá trị được đăng, bạn có thể sử dụng bộ sưu tập QueryString để truy cập.

+0

tôi sử dụng phương thức "get" – Simon

+0

Sử dụng phương thức POST thay thế, nó có nhiều lợi thế. – RedFilter

+2

Mặc dù vậy, bạn không thể đánh dấu trang đã đăng. Có lẽ anh ta muốn một chức năng tìm kiếm nơi mọi người có thể đánh dấu các kết quả, hoặc một cái gì đó tương tự. –

0

Bạn đang cố gắng làm gì? Mục đích của việc làm theo cách này là gì? Nếu bạn đặt phương thức biểu mẫu của mình thành "GET" và sau đó có trường ẩn trong biểu mẫu của bạn có tên là "id", nó sẽ thêm biến get vào cuối hành động và tạo url cho bạn.

Cập nhật: nếu trình duyệt cho phép tham số truy vấn vẫn còn trong khi thêm thông số từ GET, thì có thể có xung đột giữa các tên. Bạn có thể dễ dàng thêm một thông số truy vấn chuỗi truy vấn khác vào URL mà không nhận ra nó trùng với tên đầu vào biểu mẫu.

Để tránh điều này, nếu bạn đang sử dụng hành động GET trong biểu mẫu của mình, hãy chuyển tất cả các thông số bổ sung dưới dạng đầu vào bị ẩn.

+1

tôi muốn gửi một số trường có được, đồng thời tôi không muốn mất giá trị hiện tại của các biến được nhận của tôi. ví dụ nếu bây giờ tôi đang ở trong 'some.php? lang = am' sau khi gửi tôi cần chuyển hướng đến' some.php? lang = am & fild1_name = field1_value ... ' – Simon

+0

Bạn có thể có xung đột theo cách nào đó. Thật dễ dàng để tạo hai đầu vào có cùng tên. Hành vi đáng kinh ngạc nhất sẽ là cho phép các tham số trong URL và chỉ cần ghi đè lên chúng nếu một đầu vào có cùng tên tồn tại. –

1

không phải vì điều này sẽ gửi một yêu cầu đến

some.php?id=vaule?name1=value1

thay vì

some.php?id=vaule&name1=value1?

Theo như tôi biết chuỗi truy vấn chỉ có một "?" và một "?" được nối vào URL khi bạn sử dụng các tham số GET.

+0

Thực ra, nó không chính xác; vì phần if = value không được gửi. Xem [Câu trả lời của Seanyboy] (http://stackoverflow.com/questions/3548795/html-form-why-action-cant-have-get-value-in-it/3548989#3548989) hoặc [mine] (http://stackoverflow.com/questions/3548795/html-form-why-action-cant-have-get-value-in-it/3549258#3549258). – GreenMatt

0

Chỉ định giá trị trong hành động URI sẽ không có hiệu lực vì các giá trị trong URI sẽ bị ghi đè.Để chứng minh, hãy thử mã HTML và PHP bên dưới. Tệp form_test.html có thể được đổi tên, nhưng rõ ràng, tập lệnh PHP cần được đặt tên là regurgitate.php (hoặc hành động trong biểu mẫu cần được chỉnh sửa).

form_test.html:

<html> 
<head> 
<title>Test of setting form action url</title> 
<body> 
<form action="regurgitate.php?id=value" method="get"> 
<input type="submit" name="Submit"> 
<input type="hidden" id="test" name="test" value="test"> 
</form> 
</body> 

regurgitate.php:

<html> 
<head> 
<title>Test PHP script for testing form action</title> 
<body> 
<?php 
echo "In regurgitate.php<br>\n"; 

foreach ($_GET as $k) { 
    echo "\$_GET['$k']: >" . $_GET["$k"] . "<<br>\n"; 
} 

?> 
</body> 

Khi nút gửi được nhấp vào form_test.html, URL trong trình duyệt của tôi trở thành một cái gì đó như:

http://www.example.com/regurgitate.php?Submit=Submit+Query&test=test

Lưu ý không có "id = value" trong URL.

Đầu ra là:

Trong regurgitate.php
$ _GET [ 'Gửi Query']:> <
$ _GET [ 'test']:> kiểm tra <

0

Một công việc xung quanh nếu bạn biết những gì SUPERGLOBALS mà bạn sẽ sử dụng, hãy thử này

<?php 
if (isset($_GET['id'])) echo "<input type='hidden' name='id' value='" . $_GET['id'] . "'/>"; 
?> 

Đặt điều này vào bất cứ đâu trong biểu mẫu của bạn và nó sẽ thêm trường ẩn cho bạn. Làm việc cho tôi.

Nếu trang trước không chứa truy vấn thì php sẽ bỏ qua việc thêm trường bị ẩn

+0

Nếu bạn có 100 tham số thì sao? Bạn cần thêm 100 câu lệnh if. –

0

Hành vi này thực sự gây phiền nhiễu. Một cách giải quyết khác là thả biểu mẫu hoàn toàn và tạo url của bạn bằng tay ở phía máy khách.

Tôi đã sử dụng jQuery trong một trong các dự án .NET của chúng tôi để đạt được điều này. Nó là một mặt nạ tìm kiếm với hàng chục tham số. Một trong số đó là một giá trị thanh trượt phạm vi (tối thiểu/tối đa). Bạn sử dụng thanh trượt để chọn hai giá trị và phải nhấn vào nút tìm kiếm bên cạnh nó.

<!-- Input fields (slider code removed) --> 
<div class="input-fields"> 
    @(Model.Unit) <input type="text" id="@(sliderMinId)" value="@(sliderSelMinVal)" /> 
    to @(Model.Unit) <input type="text" id="@(sliderMaxId)" value="@(sliderSelMaxVal)" /> 
    <input type="button" id="@(sliderButton)" value="Search" /> 
</div> 

Và xử lý sự kiện cho nút:

UrlHelper h = UrlHelperExtensions.CreateRequestAgnosticUrlHelper(); 

/* Search-Button Click-EventHandler */ 
$("#@(sliderButton)").click(function(){ 
    @{ 
     string url = h.Action("Index", "SearchAction", new RouteValueDictionary(searchParams)); 
     string urlSeparator = url.Contains("?") ? "&" : "?"; 
    } 
    var url = '@Html.Raw(url + urlSeparator + sliderInfo.AssociatedFieldName)=' + $("#@Html.Raw(sliderMinId)").val() + '%20-%20' + $("#@Html.Raw(sliderMaxId)").val(); 
    window.location.replace(url); 
}); 

Đây là những gì sẽ xảy ra:

  1. Xây dựng một Url chứa tất cả các thông số trước.
  2. Nối các tham số "biểu mẫu" mới của bạn vào nó. Trong trường hợp này, chúng được thêm vào như một tham số (min-max). Đừng để điều đó làm bạn bối rối.
  3. Chuyển hướng đến Url mới.

Điều này hoàn toàn khó xử với một thứ có thể đơn giản như vậy ... Tôi hy vọng điều này sẽ hữu ích.

+0

'UrlHelperExtensions.CreateRequestAgnosticUrlHelper' là gì? – Kiquenet

+0

@Kiquenet: Rất tiếc, tôi không còn có quyền truy cập vào mã này nữa. Nếu tôi nhớ chính xác thì phương thức này tạo ra một đối tượng UrlHelper không bao gồm các tham số từ yêu cầu hiện tại. –

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