ฉันจะส่งข้อมูลที่ปิดใช้งานใน ASP.NET MVC ได้อย่างไร


108

ฉันจะส่งข้อมูลที่ปิดใช้งานใน ASP.NET MVC ได้อย่างไร


3
โดยทั่วไปคุณต้องแยกคำถามเป็นคำถามจากนั้นจึงโพสต์คำตอบแยกกัน ปิดโหวต; แนะนำให้คุณย้ายส่วน "คำตอบ" ไปยังคำตอบจริง
George Stocker

1
ฉันเชื่อว่าโพสต์ @Dhaval เป็นคำตอบที่แน่นอนเนื่องจากคำที่ปิดใช้งานในคำถามของคุณ
QMaster

คำตอบ:


160

คุณไม่สามารถสร้างสนามreadonly="readonly"แทนได้disabled="disabled"หรือไม่? ค่าฟิลด์แบบอ่านอย่างเดียวจะถูกส่งไปยังเซิร์ฟเวอร์ในขณะที่ผู้ใช้ยังไม่สามารถแก้ไขได้ SELECTแท็กเป็นข้อยกเว้นว่า


1
อ่านอย่างเดียวใช้งานได้ แต่ไม่ทำให้ฟิลด์เป็นสีเทา นี่คือตัวอย่างที่ฉันใช้: <%: Html.TextBoxFor(model => model.p1, new { @readonly = "readonly" }) %>ฉันจะทำให้สีเทาออกมาเป็นสีเทาได้อย่างไรเพื่อให้ดูเหมือนว่าแก้ไขไม่ได้ ยังดีกว่าเราสามารถใช้สิ่งที่คล้ายกับ LabelFor ได้ฉันลอง LabelFor แต่ได้รับ DisplayName เท่านั้น ....
VoodooChild

22
4 ปีที่ทำ. net asp และฉันไม่เคยรู้เลยว่าอินพุตที่ปิดใช้งานไม่ได้รับการโพสต์กลับ ... มันผ่านฉันไปได้อย่างไร เพียงรวมฟิลด์ที่ซ่อนไว้สำหรับผู้พิการที่เลือกและจัดเรียงทั้งหมด (แม้ว่า ID จะซ้ำในแบบฟอร์มที่ไม่ได้รับอนุญาต)
Piotr Kula

5
สิ่งนี้ใช้ไม่ได้กับtype="checkbox"อินพุตเช่นกัน
Nathan

1
ฉันพยายามทำสิ่งเดียวกันกับปุ่มตัวเลือก แต่อ่านอย่างเดียวไม่ได้ผล
Randy R

38

ขอบคุณทุกคน:

วิธีที่ฉันแก้ไขสิ่งนี้:

document.getElementById("Costo").readOnly = true;
document.getElementById("Costo").style.color = "#c0c0c0";

บันทึก:

ฉันได้รับข้อมูลเกี่ยวกับคำตอบนี้ แต่ได้รับการแก้ไขแล้ว


1
สิ่งนี้ไม่ได้ผลสำหรับฉัน (คิดได้ด้วยลิงก์ SO นี้ ) สิ่งนี้ได้ผล: textBox.Attributes.Add("readonly", "readonly");และคำอธิบายอยู่ในลิงค์
brian-d

เป็นเรื่องดีที่คุณแก้ไขเพราะนี่เป็นเรื่องที่สมเหตุสมผลสำหรับฉัน
Yawar

อ่านอย่างเดียวดูเหมือนจะไปได้ มันไม่ได้ทำอะไรแปลก ๆ เช่นไม่วางตัวควบคุมกลับ แต่ไม่อนุญาตให้แก้ไข ขอบคุณมาก ๆ!
Mariusz

หากต้องการเพิ่มความคิดเห็นของไมเคิล Brennt ของถ้าคุณกำลังใช้ jQuery $("#textBoxId").css("color", "#c0c0c0")บรรทัดที่สองกลายเป็น
F1Krazy

30

@ppumkin กล่าวถึงนี้ในความคิดเห็นของเขาในคำตอบนี้แต่ฉันต้องการที่จะเน้นว่ามันเป็นผมก็ไม่สามารถหาแหล่งข้อมูลอื่น ๆ <select>เกี่ยวกับการส่งข้อมูลจากคนพิการ ฉันยังเชื่อว่ามันเกี่ยวข้องกับคำถามเนื่องจากสิ่งที่เลือกไม่ใช่<input>s แต่เป็น "อินพุต"

เพียงรวมฟิลด์ที่ซ่อนไว้สำหรับผู้พิการเลือกและจัดเรียงทั้งหมด

ตัวอย่าง:

@Html.DropDownListFor(model => model.SelectedID, ... , new { disabled = "disabled"}) @* Won't be posted back *@
@Html.HiddenFor(model => model.SelectedID) @* Will be posted back *@

ข้อควรระวัง:สิ่งนี้จะทำให้สองแท็กในหน้าที่มี ID เดียวกันซึ่งไม่ใช่ HTML ที่ถูกต้องจริงๆและอาจทำให้ปวดหัวกับจาวาสคริปต์ สำหรับฉันฉันมี javascript เพื่อตั้งค่าของดรอปดาวน์ด้วย html idและถ้าคุณใส่ฟิลด์ที่ซ่อนไว้ก่อนจาวาสคริปต์จะพบว่าแทนที่จะเป็นไฟล์select.


20

โดยปกติถ้าฉันมีฟิลด์ที่เป็น "อ่านอย่างเดียว" แต่จำเป็นต้องส่งกลับไปที่เซิร์ฟเวอร์ฉันจะทำให้การแสดงผลถูกปิดใช้งาน (หรือเพียงแค่ข้อความ) แต่จะเพิ่มฟิลด์ที่ซ่อนด้วยชื่อเดียวกัน คุณยังคงต้องตรวจสอบให้แน่ใจว่าฟิลด์นั้นไม่ได้ถูกแก้ไขจริงบนฝั่งเซิร์ฟเวอร์ - เพียงแค่อย่าอัปเดตจากโมเดลในการดำเนินการของคุณ - แต่สถานะของโมเดลจะยังคงถูกต้องหากมีข้อผิดพลาด


ใช่ฉันกำลังคิดที่จะทำในสิ่งที่คุณต้องการ แต่ฉันจะต้องจัดการกับตัวแปรมากกว่านี้ ฉันกำลังกระโดดนั่นอาจเป็นโพสต์ของฉันจะปรากฏใน Google และผู้คนจะไม่ต้องทนทุกข์ทรมานกำลังมองหาวิธีง่ายๆ
Sanchitos

4
ปัญหาอย่างหนึ่งในการแก้ปัญหาของคุณคือมันพังหากปิดใช้งานจาวาสคริปต์ การแทรกฝั่งเซิร์ฟเวอร์ฟิลด์ที่ซ่อนอยู่ไม่มีปัญหานี้
tvanfosson

15

คุณยังสามารถใช้รหัสเช่นนี้ก่อนที่จะส่งแบบฟอร์ม:

$(":disabled", $('#frmMain')).removeAttr("disabled");

2
ฉันใช้สิ่งนี้ไม่ต้องกังวลเกี่ยวกับองค์ประกอบที่ซ่อนอยู่ไม่แน่ใจว่ามีข้อเสียหรือไม่ยกเว้นอาจมีความล่าช้าเล็กน้อยในการโพสต์กลับเนื่องจากฟังก์ชั่น js
IronHide

2
สำหรับคำตอบมากมายที่กล่าวถึงเกี่ยวกับการใช้แบบอ่านอย่างเดียวค่อนข้างถูกปิดใช้งานฉันเชื่อว่าในหลาย ๆ กรณีเราจำเป็นต้องใช้ปิดการใช้งานฉันอ่านประมาณ 15 คำตอบในคำถามที่คล้ายกันและเลือกสิ่งนี้ด้วยตัวกรอง jQuery ของตัวเองเพื่อเลือกองค์ประกอบที่เหมาะสมเพื่อลบแอตทริบิวต์ที่ปิดใช้งานได้ดีเยี่ยม ขอบคุณ.
QMaster

ถ้าคุณยื่นด้วยAjax.BeginForm?
markzzz


1
ดูแปลก ๆ เล็กน้อย แต่มันเป็นทางออกเดียวที่เหมาะกับฉัน ...
AGuyCalledGerald

8

โดยเบราว์เซอร์การออกแบบไม่รองรับสิ่งนั้น

สร้างสิ่งเหล่านี้readonlyซึ่งอนุญาตให้ส่งค่าไปยังเซิร์ฟเวอร์หรือหากคุณกำลังจัดการกับการควบคุมที่ยังใช้งานได้กับreadonlyแอตทริบิวต์เช่นเลือกเพิ่มรูปแบบ css pointer-events: none;เพื่อทำให้ไม่โต้ตอบ

แบบแฮ็ค แต่ได้ผล! นอกจากนี้ยังใช้งานได้เมื่อคุณส่งแบบฟอร์มโดยตรงด้วยปุ่มส่งโดยไม่ต้องใช้จาวาสคริปต์ ไม่ต้องทำงานพิเศษ!

เช่น:

<select asp-for="TypeId" 
   asp-items="@(new SelectList(await TypeRepository.FetchTypesAsync(), "TypeId", "Name"))"
   class="form-control form-control-sm" 
   readonly 
   style="pointer-events: none;">
</select>

6

คุณสามารถสร้างเทมเพลตตัวแก้ไขได้ดังตัวอย่างด้านล่าง

CSS

.disabled {
    background-color:lightgray;
}

เทมเพลตบรรณาธิการ

@model string
@Html.TextBoxFor(x => x,new {@class="disabled", @readonly=true })

2

เมื่อเราจัดการกับปิดใช้งาน แต่เลือกช่องทำเครื่องหมายและเราต้องการโพสต์ค่าเราต้องตรวจสอบให้แน่ใจว่าฟิลด์ที่ซ่อนอยู่ของเราปรากฏก่อนฟิลด์ @ Html.CheckBoxFor hidden

ต่อไปนี้เป็นลิงค์ที่ฉันพบคำตอบ http://davecallan.com/posting-disabled-checkboxes-mvc-razor-views/#comment-11033


1

ขยาย Tasos '(": disabled", $ (' # xxxForm ')). removeAttr ("disabled"); คุณสามารถใช้ได้:

$("#xxxForm").submit(function (e) {
    e.preventDefault();
    var form = this;
    $('#Field1')[0].disabled = false;
    $('#Field2')[0].disabled = false;
    ...
    $('#FieldN')[0].disabled = false;
    form.submit(); // submit bypassing the jQuery bound event
});

1

สิ่งนี้จะช่วยในการส่งค่าโมเดลใน ASP.net:

$("#iD").attr("style", "pointer-events: none;background-color:rgb(220,220,220)");

1
กรุณาจัดรูปแบบคำตอบของคุณ ทำให้ทุกคนอ่านง่ายขึ้น
Tarick Welling

0

ฉันมักจะใช้วิธีนี้สำหรับ CheckBox หรือ CheckBoxFor เพราะการปิดใช้งานจะทำให้สูญเสียค่า อ่านอย่างเดียวใช้ไม่ได้กับช่องทำเครื่องหมาย

@Html.DisplayFor(m => m.Order.Transfer)
@Html.HiddenFor(m => m.Order.Transfer)

0

เพียงใส่สคริปต์นี้ใน @section scripts ในเพจของคุณ สิ่งนี้จะเปิดใช้งานอินพุตเมื่อคุณส่งเพจและคุณควรเปลี่ยนเส้นทางผู้ใช้ไปยังเพจอื่นหลังจากส่ง

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js">
$("form").submit(function () {
                    if ($('form').valid()) {
                        $("input").removeAttr("disabled");
                    }
                });
</script>


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.