Làm cách nào để gửi đầu vào bị vô hiệu hóa trong ASP.NET MVC?


108

Làm cách nào để gửi đầu vào bị vô hiệu hóa trong ASP.NET MVC?


3
Nói chung, bạn cần đặt câu hỏi của mình thành một câu hỏi và sau đó đăng câu trả lời riêng. Biểu quyết đóng cửa; khuyên bạn nên chuyển phần 'câu trả lời' thành câu trả lời thực tế.
George Stocker

1
Tôi tin rằng bài đăng @Dhaval là câu trả lời chính xác vì từ bị tắt trong câu hỏi của bạn.
QMaster

Câu trả lời:


160

Bạn không thể thực hiện các lĩnh vực readonly="readonly"thay vì disabled="disabled"? Giá trị trường chỉ đọc sẽ được gửi đến máy chủ trong khi người dùng vẫn không thể chỉnh sửa. Tuy nhiên, SELECTthẻ là một ngoại lệ.


1
chỉ đọc hoạt động nhưng nó không làm trường màu xám. Đây là một ví dụ mà tôi đang sử dụng: <%: Html.TextBoxFor(model => model.p1, new { @readonly = "readonly" }) %>làm thế nào tôi có thể tô xám nó về mặt trực quan mà nó trông như không thể chỉnh sửa được. Hơn thế nữa chúng tôi có thể sử dụng một cái gì đó tương tự như LabelFor, tôi đã cố gắng LabelFor nhưng nó chỉ nhận được DisplayName ....
VoodooChild

22
4 năm làm .net asp và tôi chưa bao giờ biết rằng đầu vào bị vô hiệu hóa không nhận lại poste ... làm thế nào mà điều đó vượt qua tôi? Chỉ cần bao gồm một lĩnh vực ẩn cho người khuyết tật và chọn nó tất cả được sắp xếp (Mặc dù ID được lặp đi lặp lại về hình thức mà không được phép).
Piotr Kula

5
Điều này cũng không hoạt động cho type="checkbox"đầu vào
Nathan

1
Tôi đang cố gắng làm điều tương tự với các nút radio nhưng dường như chỉ đọc không hoạt động trên chúng.
Randy R,

38

Cảm ơn tất cả mọi người:

Cách tôi giải quyết vấn đề này:

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

Ghi chú:

Tôi có thông tin này trên câu trả lời nhưng tôi đã chỉnh sửa.


1
Điều này không hoàn toàn hiệu quả đối với tôi (tìm ra nó nhờ vào liên kết SO này ). Điều này làm việc: textBox.Attributes.Add("readonly", "readonly");và giải thích là trong liên kết
brian-d

Thật tốt khi bạn đã chỉnh sửa nó vì điều này có ý nghĩa hơn đối với tôi.
Yawar

chỉ đọc có vẻ là một cách để đi. Nó không làm những điều kỳ lạ như không đặt lại điều khiển nhưng không cho phép chỉnh sửa nó. Muchas Gracias!
Mariusz

Để thêm vào bình luận của Michael Brennt, nếu bạn đang sử dụng jQuery, dòng thứ hai sẽ trở thành $("#textBoxId").css("color", "#c0c0c0").
F1Krazy

30

@ppumkin đã đề cập điều này trong nhận xét của anh ấy về câu trả lời này nhưng tôi muốn làm nổi bật nó vì tôi không thể tìm thấy các tài nguyên khác về cách gửi dữ liệu từ một người khuyết tật <select>. Tôi cũng tin rằng nó có liên quan đến câu hỏi vì các lựa chọn không phải <input>là s mà chúng là "đầu vào".

Chỉ cần bao gồm trường Ẩn cho lựa chọn bị vô hiệu hóa và tất cả đều được sắp xếp.

Thí dụ:

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

Thận trọng: điều này sẽ đặt hai thẻ trên trang có cùng một ID, đây không phải là HTML thực sự hợp lệ và có thể gây đau đầu với javascript. Đối với tôi, tôi có javascript để đặt giá trị của trình đơn thả xuống bằng html của nó idvà nếu bạn đặt trường ẩn trước, javascript sẽ tìm thấy trường đó thay vì select.


20

Thông thường, nếu tôi có trường "chỉ đọc" nhưng cần được gửi trở lại máy chủ, tôi sẽ làm cho hiển thị bị vô hiệu hóa (hoặc đơn giản là văn bản), nhưng sau đó thêm một trường ẩn có cùng tên. Bạn vẫn cần đảm bảo rằng trường không thực sự được sửa đổi ở phía máy chủ - chỉ cần không cập nhật nó từ mô hình trong hành động của bạn - nhưng trạng thái mô hình sẽ vẫn chính xác nếu có lỗi.


Vâng, tôi đang nghĩ đến việc làm những gì bạn đang kiện. Nhưng tôi sẽ phải xử lý nhiều biến hơn. Tôi đang nhảy, đó có thể là bài viết của tôi sẽ xuất hiện trên google và mọi người sẽ không phải đau đầu, tìm kiếm một giải pháp dễ dàng.
Sanchitos

4
Một vấn đề với giải pháp của bạn là nó bị hỏng nếu javascript bị tắt. Việc tiêm trường ẩn phía máy chủ không có vấn đề này.
tvanfosson

15

Bạn cũng có thể sử dụng mã như thế này trước khi gửi biểu mẫu:

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

2
Tôi sử dụng này, không cần phải lo lắng về các yếu tố ẩn, không chắc chắn nếu có bất kỳ khó khăn, ngoại trừ chậm trễ có thể nhẹ về bài đăng lại do js chức năng
IronHide

2
Đối với nhiều câu trả lời đã đề cập đến việc sử dụng chỉ đọc thay vì bị vô hiệu hóa, tôi tin rằng trong nhiều trường hợp chúng ta cần sử dụng tính năng tắt, tôi đã đọc khoảng 15 câu trả lời trong các câu hỏi tương tự và chọn câu trả lời này chỉ với bộ lọc jQuery của riêng mình để chọn các phần tử thích hợp để loại bỏ thuộc tính bị vô hiệu hóa, tuyệt vời cảm ơn.
QMaster

Nếu bạn đang gửi với Ajax.BeginForm?
markzzz


1
trông hơi kỳ quặc, nhưng nó là giải pháp duy nhất làm việc cho tôi ...
AGuyCalledGerald

8

Trình duyệt thiết kế không hỗ trợ điều đó.

Tạo chúng readonlyđể cho phép gửi giá trị đến máy chủ hoặc nếu bạn đang xử lý các điều khiển vẫn có thể sử dụng được với readonlythuộc tính như Chọn, hãy thêm kiểu css pointer-events: none;để làm cho chúng không tương tác

Loại hack, nhưng hoạt động! Nó cũng hoạt động khi bạn gửi biểu mẫu trực tiếp bằng nút gửi mà không sử dụng javascript. Không cần làm thêm!

Ví dụ:

<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

Bạn có thể tạo một mẫu trình chỉnh sửa như bên dưới

CSS

.disabled {
    background-color:lightgray;
}

Mẫu biên tập viên

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


1

mở rộng Tasos '(": bị vô hiệu", $ (' # xxxForm ')). removeAttr ("bị vô hiệu"); bạn có thể dùng:

$("#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
});


0

Tôi thường sử dụng cách này cho CheckBox hoặc CheckBoxFor vì vô hiệu hóa nó sẽ làm mất giá trị. Readonly cũng không hoạt động trên hộp kiểm.

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

0

Chỉ cần đặt tập lệnh này trong tập lệnh @section trong trang của bạn. điều này sẽ kích hoạt đầu vào khi bạn gửi trang và bạn nên chuyển hướng người dùng đến một trang khác sau khi gửi.

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


-3

Chỉ cần đặt thuộc tính đó [Bắt buộc] trong ViewModel được liên kết với chế độ xem đó.

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.