Làm cách nào để gửi đầu vào bị vô hiệu hóa trong ASP.NET MVC?
Làm cách nào để gửi đầu vào bị vô hiệu hóa trong ASP.NET MVC?
Câu trả lời:
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, SELECT
thẻ là một ngoại lệ.
<%: 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 ....
type="checkbox"
đầu vào
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.
textBox.Attributes.Add("readonly", "readonly");
và giải thích là trong liên kết
$("#textBoxId").css("color", "#c0c0c0")
.
@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ó id
và nếu bạn đặt trường ẩn trước, javascript sẽ tìm thấy trường đó thay vì select
.
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.
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");
Ajax.BeginForm
?
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 readonly
thuộ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>
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 })
khi chúng ta xử lý các hộp kiểm bị vô hiệu hóa nhưng được chọn và chúng ta muốn đăng giá trị, chúng ta cần đảm bảo trường ẩn của mình xuất hiện trước trường ẩn @ Html.CheckBoxFor.
sau đây là liên kết từ nơi tôi tìm thấy câu trả lời. http://davecallan.com/posting-disabled-checkboxes-mvc-razor-views/#comment-11033
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
});
Điều này sẽ giúp gửi các giá trị mô hình trong ASP.net:
$("#iD").attr("style", "pointer-events: none;background-color:rgb(220,220,220)");
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)
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>