Devre dışı bırakılmış form girişleri istekte görünmüyor


340

Bir formda bazı devre dışı girişlerim var ve bunları bir sunucuya göndermek istiyorum, ancak Chrome bunları istek dışında tutuyor.

Gizli bir alan eklemeden bunun için herhangi bir geçici çözüm var mı?

<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, daha düşük kaliteli cevaplarla daha az katılımlı soru lehine kapanmak çok garip bir girişimdir.
hazzik

Daha eski daha az katılımlı bir soru. Teknik olarak, bu soru sorulduğunda bir nüsha olarak kapatılmalıdır. Potansiyel birleştirme için bir mod ile işaretledim, olabilir veya olmayabilir. Bu onlara bağlı.
Liam

@Liam aslında bazı cevaplar benzer görünüyor bile sorular farklı. Değerleri göndermek için "engelli" alanının nasıl yapılacağını soruyorum ve başka bir soru "nedenleri" hakkında soruyor
hazzik

Bunu çözmek için birkaç saat geçirdikten sonra buraya geldim.
Ehhh

Yanıtlar:


730

disabledÖzniteliğe sahip öğeler gönderilmez veya değerlerinin gönderilmediğini söyleyebilirsiniz ( form veri kümesini oluşturmak için HTML 5 spesifikasyonunda Adım 3 altındaki ikinci madde işaretine bakın ).

yani,

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

FYI, HTML 4 spesifikasyonunda 17.12.1'e göre :

  1. Devre dışı bırakılan denetimler odak almaz.
  2. Devre dışı bırakılmış denetimler sekme gezinmesinde atlanır.
  3. Devre dışı bırakılan denetimler başarıyla gönderilemez.

Durumunuzda readonlyözniteliği kullanabilirsiniz , bunu yaparak alanınızın verilerini yayınlayabilirsiniz.

yani,

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

FYI, HTML 4 spesifikasyonunda 17.12.2'ye göre :

  1. Salt okunur öğeler odak alır, ancak kullanıcı tarafından değiştirilemez.
  2. Sekme navigasyonunda salt okunur öğeler bulunur.
  3. Salt okunur öğeler başarıyla gönderildi.

8
Kendi sorumu yanıtlamak için: Hayır, salt okunur yalnızca type = 'text' ve type = 'password' türündeki <input /> form denetimi ve <textarea /> için çalışır. Salt okunur olan kullanıcının kontrol değerini değiştirmesini önlemektir. Kullanıcının bir onay kutusunun (veya tip telsiz girişinin) değerini değiştirmesini önlemek pek mantıklı değil ...
Muleskinner

3
@ danielson317 Seçme öğesini "devre dışı" tutabilir, ancak aynı değere sahip başka bir gizli giriş de ekleyebilirsiniz.
AlphaMale

1
@AlphaMale Ancak gizli öğe aynı ada sahip olamaz (veya olmamalıdır). Bunu, öğenin boş olmasına izin vererek ve sadece kaydedilen form durumundan orijinal değeri atlayarak geçtim. Sadece belirli form öğelerinde çalışmaz olduğunu belirtmek gerekir.
danielson317

2
Hiç bir şey buldunuz mu ve “Bu da açıkçası onların bu kadar açık olacağını düşündürdü mü?” Diye düşündünüz mü? Devre dışı bırakılabilecek veya devre dışı bırakılabilecek bir giriş alanı ekleme sorununa gidersem, bu kullanıcının değiştirmesini istemediğim anlamına gelmez , hiçbir zaman bildirilmemiş gibi etkili bir şekilde hareket etmesi gerektiği anlamına gelmez!
Nick Bedford

1
Teşekkür ederim bu yardımcı oldu ve hem cevap hem de yanıt.
user1449249

25

Jquery kullanarak ve verileri ajax ile göndererek sorununuzu çözebilirsiniz:

<script>

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

    //Rest of code
    })
</script>

+ 1 + Bu çözümle ilgili iyi olan şey, kullanıcı input üzerinden kırmızı devre dışı bırakma simgesini kullanmaya devam edebilmenizdir =)
JMASTER B

5
@ArielMaduro bunu css ile yapabilirsincursor:not-allowed;
sricks

sricks oh gerçekten ?? Bir örnek verebilir misiniz?
JMASTER B

Bu çözümü salt okunur kullanmaktan daha fazla beğenir, çünkü devre dışı alanlar odaklanamaz
Andreas

9

Etkinleştirilmiş girişlere ek olarak devre dışı girişlerden değerler göndermek için, formun gönderilirken tüm girişlerini yeniden etkinleştirmeniz yeterlidir.

<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>

JQuery'yi tercih ediyorsanız:

<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>

ASP.NET MVC C # Razor için gönderme işleyicisini aşağıdaki gibi eklersiniz:

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 -->
}

jquery seçeneği üzerinde tırnak eksik biri var
cagcak

8

Kesinlikle alanı devre dışı bırakmanız ve verileri iletmeniz gerekiyorsa, aynı verileri gizli bir alana girmek için bir javascript kullanabilirsiniz (veya sadece gizli alanı da ayarlayabilirsiniz). Bu, devre dışı bırakmanıza izin verir, ancak başka bir sayfaya gönderiyor olsanız bile yine de verileri yayınlar.


1
Bu çözüm benim de kullandığım şeydir - ama az önce öğrendiğim gibi - salt okunur özellik çok daha iyi bir çözümdür
Muleskinner

4

Çok yararlı olduğu için bu cevabı güncelliyoruz. Sadece girişe salt okunur ekleyin.

Böylece form şöyle olacaktır:

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

4

Anlamsal olarak bu doğru davranış gibi geliyor

Kendi kendime " Bu değeri neden göndermem gerekiyor? "

Bir formda devre dışı bırakılmış bir girdiniz varsa, muhtemelen kullanıcının değeri doğrudan değiştirmesini istemezsiniz

Devre dışı bırakılan bir girişte görüntülenen herhangi bir değer,

  1. formu üreten sunucudaki bir değerden çıktı veya
  2. form dinamikse, formdaki diğer girdilerden hesaplanabilir olun

Formu işleyen sunucunun kendisine hizmet veren sunucuyla aynı olduğu varsayılarak, devre dışı girişlerin değerlerini yeniden oluşturmak için gereken tüm bilgiler işlenirken kullanılabilir olmalıdır

Aslında, veri bütünlüğünü korumak için - devre dışı bırakılan girişin değeri işleme sunucusuna gönderilse bile, gerçekten doğrulamanız gerekir. Bu doğrulama, yine de değerleri yeniden oluşturmak için ihtiyaç duyduğunuz düzeyde bilgi gerektirir!

Neredeyse salt okunur girdilerin istekte de gönderilmemesi gerektiğini savunuyorum

Düzeltilmekten mutluluk duyuyorum , ancak salt okunur / devre dışı girdilerin nereye gönderilmesi gerektiğini düşünebileceğim tüm kullanım durumları gerçekten sadece kılık değiştiren sorunları şekillendiriyor


1
değerinin doğrudan krom geliştirici araçlarıyla manipüle edilebileceğini unutmamak için
jimjim

2

Bunun daha kolay olduğunu düşünüyorum. giriş alanını salt okunur hale getirin, ardından son kullanıcının salt okunur olduğunu bilmesi için bu alanı biçimlendirin. buraya yerleştirilen girişler (örneğin AJAX'tan) ekstra kod olmadan da gönderebilir.

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

-6

Tamamen devre dışı bırakabilirsiniz, html form formatı ile ilgili hiçbir şey göndermeyeceğinden ağrılıdır. <p> veya başka bir etiket .

Bunun yerine düzenli olarak

<input text tag just before you have `/>

bunu ekle readonly="readonly"

Metninizi devre dışı bırakmaz, ancak kullanıcı tarafından değişmez, bu nedenle <p>form gibi çalışır ve değer gönderir. Daha çok <p>etiket gibi yapmak istiyorsanız kenarlığı kaldırın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.