Đầu vào mẫu bị vô hiệu hóa không xuất hiện trong yêu cầu


339

Tôi có một số đầu vào bị vô hiệu hóa trong một biểu mẫu và tôi muốn gửi chúng đến máy chủ, nhưng Chrome loại trừ chúng khỏi yêu cầu.

Có cách giải quyết nào cho việc này mà không cần thêm trường ẩn không?

<form action="/Media/Add">
    <input type="hidden" name="Id" value="123" />

    <!-- this does not appear in request -->
    <input type="textbox" name="Percentage" value="100" disabled="disabled" /> 

</form>


2
@Liam đó là một nỗ lực rất kỳ lạ để đóng lại cho câu hỏi ít tham dự với câu trả lời chất lượng thấp hơn.
hazzik

Một già câu hỏi ít tham dự. Về mặt kỹ thuật, câu hỏi này nên được đóng lại như một bản sao khi nó được hỏi. Tôi đã gắn cờ nó với một mod để hợp nhất tiềm năng, có thể hoặc không thể xảy ra. Tùy họ.
Liam

@Liam trong thực tế các câu hỏi khác nhau thậm chí một số câu trả lời trông giống nhau. Tôi hỏi về cách tạo trường "bị vô hiệu hóa" để gửi các giá trị và một câu hỏi khác hỏi về "lý do"
hazzik

Chỉ đến đây sau khi tôi dành vài giờ cố gắng giải quyết nó.
Ehhh

Câu trả lời:


728

Các phần tử với disabledthuộc tính không được gửi hoặc bạn có thể nói các giá trị của chúng không được đăng (xem dấu đầu dòng thứ hai trong Bước 3 trong thông số HTML 5 để xây dựng tập dữ liệu biểu mẫu ).

I E,

<input type="textbox" name="Percentage" value="100" disabled="disabled" /> 

FYI, mỗi 17.12.1 trong thông số HTML 4:

  1. Điều khiển bị vô hiệu hóa không nhận được trọng tâm.
  2. Điều khiển bị vô hiệu hóa được bỏ qua trong điều hướng tab.
  3. Điều khiển bị vô hiệu hóa không thể được đăng thành công.

Bạn có thể sử dụng readonlythuộc tính trong trường hợp của mình, bằng cách này, bạn sẽ có thể đăng dữ liệu của trường.

I E,

<input type="textbox" name="Percentage" value="100" readonly="readonly" />

FYI, mỗi 17.12.2 trong thông số HTML 4:

  1. Các yếu tố chỉ đọc nhận được trọng tâm nhưng người dùng không thể sửa đổi.
  2. Các yếu tố chỉ đọc được bao gồm trong điều hướng tab.
  3. Yếu tố chỉ đọc được đăng thành công.

8
Để trả lời câu hỏi của riêng tôi: Không, chỉ đọc chỉ hoạt động đối với điều khiển biểu mẫu <input /> của type = 'text' và type = 'password' và cho <textarea />. Những gì chỉ đọc là ngăn người dùng thay đổi giá trị điều khiển. Ngăn người dùng thay đổi giá trị của hộp kiểm (hoặc đầu vào của loại radio) không có ý nghĩa nhiều ...
Muleskinner

3
@ danielson317 Bạn có thể giữ phần tử chọn "bị vô hiệu hóa" nhưng cũng có thể thêm một đầu vào ẩn khác có cùng giá trị.
AlphaMale

1
@AlphaMale Nhưng phần tử ẩn không thể có cùng tên (hoặc không nên). Tôi đã vượt qua điều này bằng cách cho phép phần tử trống và chỉ đập giá trị ban đầu từ trạng thái biểu mẫu đã lưu. Nó chỉ đáng chú ý chỉ đọc không hoạt động trên các mục mẫu chọn.
danielson317

2
Bạn có bao giờ tìm thấy một cái gì đó ra và nghĩ, "Cái quái gì khiến họ nghĩ điều này là hiển nhiên?" Nếu tôi gặp rắc rối trong việc bao gồm một trường đầu vào có thể bị vô hiệu hóa hoặc không, điều đó có nghĩa là tôi không muốn người dùng thay đổi nó, không phải là nó sẽ hoạt động hiệu quả như thể nó chưa bao giờ được tuyên bố!
Nick Bedford

1
Cảm ơn bạn điều này rất hữu ích và cả câu trả lời và phản hồi.
dùng1449249

24

Sử dụng Jquery và gửi dữ liệu bằng ajax, bạn có thể giải quyết vấn đề của mình:

<script>

$('#form_id').submit(function() {
    $("#input_disabled_id").prop('disabled', false);

    //Rest of code
    })
</script>

+1 điểm hay của giải pháp này là bạn vẫn có thể sử dụng biểu tượng tắt màu đỏ khi người dùng qua đầu vào =)
JMASTER B

5
@ArielMaduro bạn có thể làm điều đó với csscursor:not-allowed;
sricks

@sricks ơi thật sao ?? bạn có thể cung cấp một ví dụ?
JMASTER B

thích giải pháp này hơn là sử dụng chỉ đọc, bởi vì các trường bị vô hiệu hóa không thể nhận được trọng tâm
Andreas

9

Để đăng các giá trị từ các đầu vào bị vô hiệu hóa ngoài các đầu vào được bật, bạn chỉ cần bật lại tất cả các đầu vào của biểu mẫu khi nó đang được gửi.

<form onsubmit="this.querySelectorAll('input').forEach(i => i.disabled = false)">
    <!-- Re-enable all input elements on submit so they are all posted, 
         even if currently disabled. -->

    <!-- form content with input elements -->
</form>

Nếu bạn thích jQuery:

<form onsubmit="$(this).find('input').prop('disabled', false)">
    <!-- Re-enable all input elements on submit so they are all posted, 
         even if currently disabled. -->

    <!-- form content with input elements -->
</form>

Đối với ASP.NET MVC C # Razor, bạn thêm trình xử lý gửi như thế này:

using (Html.BeginForm("ActionName", "ControllerName", FormMethod.Post,
    // Re-enable all input elements on submit so they are all posted, even if currently disabled.
    new { onsubmit = "this.querySelectorAll('input').forEach(i => i.disabled = false)" } ))
{
    <!-- form content with input elements -->
}

thiếu một trích dẫn về tùy chọn jquery
cagcak

8

Nếu bạn hoàn toàn phải tắt trường và chuyển dữ liệu, bạn có thể sử dụng javascript để nhập cùng một dữ liệu vào trường ẩn (hoặc chỉ đặt trường ẩn). Điều này sẽ cho phép bạn vô hiệu hóa nhưng vẫn đăng dữ liệu mặc dù bạn sẽ đăng lên một trang khác.


1
Giải pháp này cũng là những gì tôi đã sử dụng - nhưng như tôi mới biết - thuộc tính chỉ đọc là một giải pháp tốt hơn nhiều
Muleskinner

4

Tôi đang cập nhật câu trả lời này vì nó rất hữu ích. Chỉ cần thêm chỉ đọc vào đầu vào.

Vì vậy, hình thức sẽ là:

<form action="/Media/Add">
    <input type="hidden" name="Id" value="123" />
    <input type="textbox" name="Percentage" value="100" readonly/>
</form>

4

Về mặt ngữ nghĩa, cảm giác như hành vi đúng

Tôi sẽ tự hỏi " Tại sao tôi cần gửi giá trị này? "

Nếu bạn có một đầu vào bị vô hiệu hóa trên một biểu mẫu, thì có lẽ bạn không muốn người dùng thay đổi giá trị trực tiếp

Bất kỳ giá trị nào được hiển thị trong đầu vào bị vô hiệu hóa phải là

  1. đầu ra từ một giá trị trên máy chủ đã tạo ra biểu mẫu hoặc
  2. nếu biểu mẫu là động, có thể tính toán được từ các đầu vào khác trên biểu mẫu

Giả sử rằng máy chủ xử lý biểu mẫu giống như máy chủ phục vụ nó, tất cả thông tin để sao chép các giá trị của các đầu vào bị vô hiệu hóa sẽ có sẵn khi xử lý

Trong thực tế, để bảo toàn tính toàn vẹn dữ liệu - ngay cả khi giá trị của đầu vào bị vô hiệu hóa được gửi đến máy chủ xử lý, bạn thực sự nên xác thực nó. Xác nhận này sẽ yêu cầu cùng một mức thông tin như bạn sẽ cần để tái tạo các giá trị nào!

Tôi gần như lập luận rằng các đầu vào chỉ đọc không nên được gửi trong yêu cầu

Rất vui khi được sửa chữa, nhưng tất cả các trường hợp sử dụng tôi có thể nghĩ về nơi mà các đầu vào chỉ đọc / bị vô hiệu hóa cần được gửi thực sự chỉ là các vấn đề về kiểu dáng được ngụy trang


1
đừng quên rằng giá trị của nó có thể được thao tác trực tiếp với các công cụ dành cho nhà phát triển chrome
jimjim

2

Tôi thấy việc này dễ dàng hơn. chỉ đọc trường đầu vào, sau đó định kiểu nó để người dùng cuối biết nó chỉ đọc. đầu vào được đặt ở đây (ví dụ từ AJAX) vẫn có thể gửi mà không cần thêm mã.

<input readonly style="color: Grey; opacity: 1; ">

-6

Bạn hoàn toàn có thể tránh việc vô hiệu hóa, thật đau đớn vì định dạng dạng html sẽ không gửi bất cứ thứ gì liên quan đến <p>hoặc một số nhãn khác.

Vì vậy, bạn có thể thay thế thường xuyên

<input text tag just before you have `/>

thêm điều này readonly="readonly"

Nó sẽ không vô hiệu hóa văn bản của bạn nhưng sẽ không thay đổi bởi người dùng để nó hoạt động như thế <p>và sẽ gửi giá trị thông qua biểu mẫu. Chỉ cần xóa đường viền nếu bạn muốn làm cho nó giống <p>thẻ hơn

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.