c# - ¿Cómo envío un campo deshabilitado en ASP.NET MVC?
¿Cómo envío un input deshabilitado en ASP.NET MVC?
Respuesta #1
¿No puedes hacer que el campo readonly="readonly" en lugar de disabled="disabled"? El valor de un campo readonly se enviará al servidor mientras sigue siendo no editable por el usuario. Sin embargo, una etiqueta SELECT es una excepción.
Respuesta #2
Gracias a todos:
La forma en que resolví esto:
document.getElementById("Costo").readOnly = true;
document.getElementById("Costo").style.color = "#c0c0c0";
Nota:
Obtuve esta información sobre la respuesta, pero fue editada.
Respuesta #3
@ppumkin mencionó esto en su comentario sobre esta respuesta, pero quería destacarlo ya que no pude encontrar otros recursos sobre cómo enviar datos desde un <select> deshabilitado. También creo que es relevante para la pregunta, ya que los selectores no son <input>s, pero son "inputs".
Solo incluye un campo oculto para el selector deshabilitado y todo está resuelto.
Ejemplo :
@Html.DropDownListFor(model => model.SelectedID, ... , new { disabled = "disabled"}) @* Won't be posted back *@
@Html.HiddenFor(model => model.SelectedID) @* Will be posted back *@
Precaución: esto pondrá dos etiquetas en la página con el mismo ID, lo cual no es realmente HTML válido y podría causar problemas con javascript. En mi caso, tengo javascript para establecer el valor del menú desplegable por su id de html, y si pones primero el campo oculto, el javascript encontrará eso en lugar del select.
Respuesta #4
Normalmente, si tengo un campo que es "solo lectura" pero necesita enviarse de nuevo al servidor, hago que la visualización esté deshabilitada (o simplemente como texto), pero luego agrego un campo oculto con el mismo nombre. Aún necesitas asegurarte de que el campo no se modifique realmente en el servidor; simplemente no lo actualices desde el modelo en tu acción, pero el estado del modelo seguirá siendo preciso si hay errores.
Respuesta #5
También puedes usar código como este antes de que se envíe el formulario:
$(":disabled", $('#frmMain')).removeAttr("disabled");
Respuesta #6
Por diseño, los navegadores no soportan eso.
O bien hazlos readonly, lo que permite enviar valores al servidor, o si estás tratando con controles que aún son utilizables con el atributo readonly como Select, agrega el estilo CSS pointer-events: none; para hacerlos no interactivos
Una especie de truco, ¡pero funciona! También funciona cuando envías el formulario directamente con el botón de enviar sin usar JavaScript. ¡No se requiere trabajo extra!
Ej :
<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>
