web-dev-qa-db-fra.com

Reliure de modèle avec zone de texte désactivée

J'ai une zone de texte que je définis comme

<%= 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 lieront correctement, mais si je change @ disabled = "disabled à @ readonly =" readonly "le nom d'utilisateur se lie correctement et tout fonctionne.

Il semble que la liaison de modèle ignore les valeurs des champs désactivés. Est-ce qu'ils peuvent contourner cela? J'ai toujours besoin de la valeur du champ pour se lier au modèle. Je peux utiliser readonly, mais préférerais utiliser disabled, il est donc évident pour l'utilisateur qu'il ne peut pas modifier la valeur du champ.

38
modernzombie

Je crois qu'un champ de formulaire désactivé ne soumet rien. Si vous avez un formulaire et que vous désactivez le champ foo dans ce formulaire, la publication du message n'aura pas la valeur du champ foo. C'est simplement la nature de la désactivation d'un champ en HTML et ce n'est pas un problème de MVC.

56
John Hartsock

use readonly - désactive l'entrée mais vous l'aurez toujours dans la liaison . Vous pouvez appliquer un style sur la div pour la rendre grise 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>
47
vincemcc79

Si vous souhaitez que la valeur soit renvoyée sans être modifiable, envisagez de 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 le modifier.

5
Dan Diplo

Comme suggéré dans les commentaires, readonly au lieu de disabled peut être une option, mais cela ne fonctionnera pas pour les boîtes de sélection. Au lieu de créer une entrée masquée, vous pouvez conserver les entrées ou les sélectionner comme désactivées tout en transmettant les données en modifiant la propriété désactivée avec JavaScript lors de la soumission. 

Avec jQuery, cela ressemblerait à ceci:

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

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

<%= Html.Hidden("Username", Model.Form.Username)%>
4
Khaled Musaied

Le moyen le plus simple de soumettre des champs désactivés est de les copier sur un contrôle invisible et non désactivé avant de les soumettre. Certaines personnes créent ces contrôles manuellement et se connectent à l'événement on change dans jQuery pour les copier à la demande, mais la solution ci-dessous est générique, facile et moins bavarde - bien qu'une règle: vous devez créer (restituer) une page vierge après publication ( alors 

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

});
1
baHI

@readonly = true ne fonctionne pas sur ma page. J'ai fait des recherches supplémentaires. Voici l'article qui l'explique

L'attribut ReadOnly ne fonctionne pas dans les modèles ASP.NET MVC

0
user12345