2010-04-16 2 views
34

J'ai une zone de texte que je suis définissant commeModèle liaison sécurisée avec Textbox handicapés

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

Dans mon action

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

     ... 

     return View(model); 
    } 

post.Username sera vide, toutes les autres propriétés se lient correctement, mais si je change @ disabled = "disabled to @ readonly =" readonly "le nom d'utilisateur se lie correctement et tout fonctionne

Il semble que la liaison par modèle ignore les valeurs dans les champs désactivés. J'ai besoin de la valeur du champ pour lier le modèle. Je peux utiliser readonly mais je préférerais utiliser désactivé, donc il est visuellement évident pour l'utilisateur qu'il ne peut pas modifier la valeur du champ.

Répondre

52

Je crois qu'un champ de formulaire qui est désactivé ne soumet rien. Si vous avez un formulaire et désactivez le champ foo dans ce formulaire, lorsque vous postez le message n'aura pas la valeur pour le champ foo. Ceci est simplement la nature de désactiver un champ en HTML et n'est pas un problème MVC.

+3

Wow, je ne peux pas croire que je ne l'ai pas rencontré ce avant, ça ou complètement oublié. Merci. – modernzombie

+0

C'est une chose facile à oublier, mais Dan Diplo a raison, dans de nombreux cas, un champ caché est un bon moyen d'aller. Par curiosité, pourquoi désactivez-vous un champ de nom d'utilisateur? –

+0

Je crée un formulaire dans lequel un administrateur peut créer de nouvelles connexions pour le système. Je désactivais le nom d'utilisateur lorsque l'administrateur modifiait le login (le prénom et le nom et les emails sont éditables) car le nom d'utilisateur ne peut pas être changé. J'ai décidé d'utiliser readonly et je peux utiliser des CSS pour colorer le champ différemment. – modernzombie

5

Si vous souhaitez que la valeur soit renvoyée mais ne puisse pas être modifiée, vous pouvez la placer dans un champ masqué. Évidemment, ne le faites pas pour tout ce qui nécessite un certain degré de sécurité, car un utilisateur peut l'altérer.

40

utilisez readonly - désactive l'entrée mais vous l'avez toujours dans la liaison. Vous pourriez appliquer un style sur le div pour le rendre grisâtre peut-être?

<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

Belle réponse pour l'OP ... Merci :) – Tushar

+1

Entré ici parce que j'avais le même problème pour une liste déroulante, pour le futur ppl readonly ne fonctionne pas pour une liste déroulante :) – FRoZeN

5

Vous pouvez faire une solution de contournement en ajoutant un champ caché avec la même valeur;)

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

Ainsi l'élément (s) n'est pas vraiment valide HTML et pourrait causer des maux de tête avec javascript. – QMaster

1

manière la plus simple de soumettre des champs handicapés est de les copier sur un contrôle invisible, non invalide avant soumettre . Certaines personnes créent ces contrôles manuellement et se connectent à l'événement on change de jQuery pour les copier à la demande, mais cette solution est générique, facile et moins bavarde - bien qu'une règle: vous devez créer (rendre) une page propre après la publication (si

$('#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

ingénieux mec! Mais vous pouvez également faire quelques changements et mettre ce methon sur onload – clement

+0

Cela fonctionne - mais excessif. Si vous utilisez déjà jQuery, modifiez simplement la propriété disabled à false lors de l'envoi. Vois ma réponse. –

3

Comme suggéré dans les commentaires, en lecture seule au lieu de personnes handicapées peut être une option, mais cela ne fonctionnera pas pour les boîtes de sélection Au lieu de créer une entrée cachée, vous pouvez p les entrées ou sélectionne comme désactivé et passe toujours les données en changeant la propriété désactivée avec JavaScript lors de la soumission.

En utilisant jQuery ce serait ressembler à ceci:

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