2010-04-16 4 views
34

Tengo un cuadro de texto que estoy definiendo comomodelo de unión con el cuadro de texto discapacitados

<%= Html.TextBox("Username", Model.Form.Username, 
     new { @class = "textbox", @disabled = "disabled" })%> 

En mi acción

[AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult EditLogin(LoginForm post) { 

     ... 

     return View(model); 
    } 

post.Username estará en blanco, todas las demás propiedades se unen correctamente, pero si change @ disabled = "disabled to @ readonly =" readonly "el nombre de usuario se une correctamente y todo funciona.

Parece que el enlace de modelo ignora los valores en los campos deshabilitados. ¿Es esto una forma de evitar esto? Necesito el valor del campo para enlazar al modelo. Puedo usarlo de forma sencilla, pero preferiría usar deshabilitado, por lo que es evidente para el usuario que no puede editar el valor del campo.

Respuesta

52

Creo que un campo de formulario que está deshabilitado no envía nada. Si tiene un formulario y deshabilita el campo foo en ese formulario, cuando publique la publicación no tendrá el valor para el campo foo. Esta es simplemente la naturaleza de deshabilitar un campo en HTML y no es un problema de MVC.

+3

Wow, no puedo creer que no se han topado con esto antes, eso o completamente se olvidó de él. Gracias. – modernzombie

+0

Es fácil de pasar por alto, pero Dan Diplo tiene razón, en muchos casos un campo oculto es una buena forma de hacerlo. Por curiosidad, ¿por qué estás deshabilitando un campo de nombre de usuario? –

+0

Estoy creando un formulario donde un administrador puede crear nuevos inicios de sesión para el sistema. Estaba deshabilitando el nombre de usuario cuando el administrador estaba editando el inicio de sesión (el nombre y apellido y los correos electrónicos son editables) porque no se puede cambiar el nombre de usuario. Decidí usar solo de forma legible y puedo usar CSS para colorear el campo de forma diferente. – modernzombie

5

Si desea que se devuelva el valor, pero no se puede editar, considere colocarlo en un campo oculto. Obviamente, no hagas esto para nada que requiera un grado de seguridad, ya que un usuario puede manipularlo.

40

use readonly - deshabilitará la entrada pero aún la tendrá en el enlace. ¿Podría aplicar un estilo en el div para que parezca gris?

<div class="editor-label"> 
    @Html.LabelFor(model => model.FileName) 
</div> 
<div class="editor-field-greyed-out"> 
    @Html.TextBoxFor(model => model.FileName, new { @readonly = true }) 
    @Html.ValidationMessageFor(model => model.FileName) 
</div> 
+0

Agradable respuesta para el OP ... Gracias :) – Tushar

+1

Vine aquí porque tuve el mismo problema para un dropdownbox, para el futuro ppl simplemente no funciona para un menú desplegable :) – FRoZeN

5

Usted puede hacer una solución mediante la adición de un campo oculto con el mismo valor;)

<%= Html.Hidden("Username", Model.Form.Username)%> 
+0

Así que el elemento (s)) no es realmente HTML válido y podría causar dolores de cabeza con javascript. – QMaster

1

forma más sencilla de enviar los campos deshabilitados es copiarlos en un control deshabilitado invisible, no antes de enviar . Algunas personas crean esos controles manualmente y se conectan al evento de cambio en jQuery para copiarlos a pedido, pero esta solución a continuación es genérica, fácil y menos hablante, aunque una regla: debes crear (renderizar) una página limpia después de la devolución (por lo

$('#submitBtn').closest('form').one('submit', function() { 

    var $form = $(this); 

    // input, textarea, select, option, ----- button, datalist, keygen, output, optgroup 
    $form.find('input:disabled, textarea:disabled, select:disabled, option:disabled').each(function() { 

     var $item = $(this); 

     var hiddenItem = $item.clone(); 
     hiddenItem.removeAttr('id'); 
     hiddenItem.removeAttr('disabled'); 
     hiddenItem.attr('style', 'display: none'); 

     $item.after(hiddenItem); 
    }); 

}); 
+0

ingenioso amigo! Pero también puedes hacer algunos cambios y poner este método en onload – clement

+0

Esto funciona, pero es excesivo. Si ya está usando jQuery, simplemente cambie la propiedad deshabilitada a falso en el envío. Ver mi respuesta –

3

Como se sugiere en los comentarios, en lugar de sólo lectura discapacitados puede ser una opción, pero no funcionará para los cuadros de selección. En lugar de crear una entrada oculta, puede p las entradas o las selecciones como deshabilitadas y todavía pasar los datos cambiando la propiedad deshabilitada con JavaScript en el envío.

Usando jQuery se vería así:

$('form').on('submit', function(){ 
    $('input, select').prop('disabled',false); 
    return true; 
}); 
Cuestiones relacionadas